ページ分割されたデータを表示するために ListView を使用しています。
<asp:ListView ID="listOfItems" runat="server" DataSourceID="ItemsDataSource" EnableModelValidation="True" InsertItemPosition="FirstItem" ItemPlaceholderID="ItemRowContainer">
<LayoutTemplate>
<div class="tablecontainer">
<div class="pagination-top">
<custom:TablePaginationControl ID="TablePaginationControl1" runat="server" ControlID="listOfItems" ShowPageSizeList="true" />
</div>
<table class="list-view">
<tr>
<th class="first-column" width="350px">
<asp:LinkButton ID="SortByName" runat="server" CommandArgument="Name" CommandName="SortMainList" OnCommand="SortItems" Text="<%$ Resources:Name %>"></asp:LinkButton>
</th>
...
</tr>
<tbody>
<tr runat="server" id="ItemRowContainer" />
</tbody>
</table>
</div>
</LayoutTemplate>
...
</asp:ListView>
データソース定義:
<asp:ObjectDataSource ID="ItemsDataSource" runat="server" EnablePaging="True" InsertMethod="AddItems" SelectCountMethod="SelectItemsCount" SelectMethod="SelectItems" TypeName="SHLCentral.TheLibrary.Web.View.DocumentManagementControl, ClientPortal.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd2852a10d692fb9" UpdateMethod="UpdateItems">
...
</asp:ObjectDataSource>
Revelant のコード ビハインドは、次の 2 つのメソッドで構成されています。
public IEnumerable<ListDocumentsResult> SelectItems(
int maximumRows,
int startRowIndex)
{
var results = Controller.ListDocuments(new ListDocumentsRequest());
PropertyInfo sortProperty;
try
{
sortProperty = typeof (ListDocumentsResult).GetProperty((string) ViewState["mainListSortColumn"]);
}
catch
{
sortProperty = null;
}
Func<ListDocumentsResult, object> sortFunction = sortProperty == null
? (Func<ListDocumentsResult, object>) (ldr => ldr.LastUpdatedDate)
: (ldr => sortProperty.GetValue(ldr, new object[0]));
return
(sortProperty == null || !((bool) ViewState["mainListSortAsc"])
? results.OrderByDescending(sortFunction)
: results.OrderBy(sortFunction))
.Skip(startRowIndex)
.Take(maximumRows);
}
protected void SortItems(object sender, CommandEventArgs e)
{
if (e.CommandName == "SortMainList")
{
var sortColumn = (string) e.CommandArgument;
if ((string)ViewState["mainListSortColumn"] == sortColumn)
{
ViewState["mainListSortAsc"] = !(bool)ViewState["mainListSortAsc"];
}
else
{
ViewState["mainListSortAsc"] = true;
ViewState["mainListSortColumn"] = sortColumn;
}
DataBind();
}
}
したがって、私の意図は次のとおりです。ユーザーがLinkButton
「名前」列ヘッダーに含まれるをクリックすると(わかりやすくするために、1列を除いてすべて省略しました)、SortItems
メソッドが呼び出されます:ソートされた列名とソート順をに設定しViewState
、リロードしますメソッドをListView
使用しDataBind
ます。の Select メソッドで、この値ObjectDataSource
を読み取り、それらを使用してデータを並べ替えます。ViewState
これらすべてのメソッドにブレークポイントを設定すると、 をクリックすると、次の一連の呼び出しがあることがわかりますLinkButton
。
OnLoad
SortItems
SelectItems
私が抱えている問題は、SelectItems
メソッドに到達したときにViewState
完全に空である (キーが 0 である) ことです。ページの Load メソッドにブレークポイントを設定すると、これらすべてを含むコントロールが 1 回だけ読み込まれます。DataBind
メソッドはコントロールの読み込みをトリガーしていないようです。コントロールの新しいインスタンスのメソッドをトリガーしているだけのようです(SelectItems
つまり、を使用する代わりにViewState
、メソッドにインスタンス フィールドを設定するSortItems
と、フィールドは null になります)。メソッドに入るときSelectItems
)。
ページで がアクティブになっていることは確かです(たとえば、Firefox 拡張機能を使用してブラウザー側でキーをViewState
見つけることができます)。ViewState
ページ/コントロールのライフサイクルについて、私にははっきりしないことがあります。誰かが私にそれが何であるかを説明できますか?