DataPagerを使用したListViewが機能しない
質問
私が読んだすべてのものから、ListViewコントロールにページングを追加するのは非常に簡単なように思えましたが、私にとってはうまくいきません。 ListViewコントロールとDataPagerコントロールをフォームに追加し、それらを相互に接続した後、非常に奇妙な動作が発生しています。 DataPagerはListViewのページサイズを正しく制限しますが、ページングボタンをクリックしてもListViewにはまったく影響しません。ページングボタンは、最後のページに移動したときなどに最後のボタンが無効になるなどのように、彼らが仕事をしていると考えているように見えますが、ListViewは変更されません。また、DataPagerを2回クリックすると何もできません。つまり、Last onceをクリックしても何も起こりませんが、2回クリックすると、最後のページが選択されたようにDataPagerが反応します。
考えられる唯一のことは、LinqDataSourceコントロールなどを使用せずに、実行時にデータソースを(LINQオブジェクトに)バインドすることです。誰もこの動作を見ましたか?私は何か間違っていますか?私が使用しているコードは次のとおりです。
<asp:DataPager ID="HistoryDataPager" runat="server" PagedControlID="HistoryListView" PageSize="10">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="true" ShowLastPageButton="true" />
</Fields>
</asp:DataPager>
<asp:ListView ID="HistoryListView" runat="server">
...
</asp:ListView>
分離コード:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
HistoryListView.DataSource = From x in myContext.myTables ...
DataBind()
End If
End Sub
解決
ListViewPagedDataSourceを見てください。
private ListViewPagedDataSource GetProductsAsPagedDataSource(DataView dv)
{
// Limit the results through a PagedDataSource
ListViewPagedDataSource pagedData = new ListViewPagedDataSource();
pagedData.DataSource = dv;
pagedData.MaximumRows = dv.Table.Rows.Count;
pagedData.TotalRowCount = dpTop.PageSize;
if (Request.QueryString[dpTop.QueryStringField] != null)
pagedData.StartRowIndex = (Convert.ToInt32(Request.QueryString[dpTop.QueryStringField]) - 1) * dpTop.PageSize;
else
pagedData.StartRowIndex = 0;
return pagedData;
}
ただし、最後のページの表示に問題があります。 DataPagerは最初のページに戻りますが、表示されるデータは最後のページです。
他のヒント
OnPreRenderイベントでリストビューを再度データバインドする必要があります。
protected override void OnPreRender(EventArgs e)
{
ListView1.DataBind();
base.OnPreRender(e);
}
-更新
asp.net ajaxを使用していくつかのリストビューを作成した後、上記のソリューションよりも意味のあるソリューションを見つけました。通常、ページロードメソッドまたはボタンクリックイベントハンドラーでListviewをデータバインドし、ポストバックがあると、上記の問題で説明したようにデータバインディングが失われます。そのため、リストビューのページプロパティ変更イベントハンドラーで再度データバインドする必要があります。
ListView_PagePropertiesChanged(object sender, EventArgs e)
{
ListView.DataSource=someDatasource;
ListView.DataBind()
}
もう1つのソリューション、そのシンプルで「ID」を取得するだけ&quot; QUERY-STRING&quot;データベースから、[QueryStringField =&quot; ID&quot;としてページャーコントロールプロパティに設定します。 ]のように:
<asp:DataPager ID="DataPagerProducts" runat="server" QueryStringField="ID" PageSize="3">
<Fields>
<asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
<asp:NumericPagerField />
<asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
</Fields>
</asp:DataPager>
注:起動しない場合は、 [PagedControlID =&quot; ListView_Name&quot; ]
。
ページの読み込み時ではなく、datapagerの事前レンダリングイベントでリストビューをバインドします。 こちらのソリューション
また、ListViewのデータソースが変更された場合(検索パラメーターに基づいてデータを表示する場合など)、データソースが更新されるたびにページャーをリセットすることを忘れないでください。 ListViewでは、これは他のデータバインドコントロール(GridViewなど)ほど簡単ではありません:
private void ResetListViewPager()
{
DataPager pager = (DataPager)ListViewMembers.FindControl("DataPager1");
if (pager != null)
{
CommandEventArgs commandEventArgs = new CommandEventArgs(DataControlCommands.FirstPageCommandArgument, "");
// MAKE SURE THE INDEX IN THE NEXT LINE CORRESPONDS TO THE CORRECT FIELD IN YOUR PAGER
NextPreviousPagerField nextPreviousPagerField = pager.Fields[0] as NextPreviousPagerField;
if (nextPreviousPagerField != null)
{
nextPreviousPagerField.HandleEvent(commandEventArgs);
}
// THIS COMMENTED-OUT SECTION IS HOW IT WOULD BE DONE IF USING A NUMERIC PAGER RATHER THAN A NEXT/PREVIOUS PAGER
//commandEventArgs = new CommandEventArgs("0", "");
//NumericPagerField numericPagerField = pager.Fields[0] as NumericPagerField;
//if (numericPagerField != null)
//{
// numericPagerField.HandleEvent(commandEventArgs);
//}
}
}
<asp:ListView ID="ListView1" runat="server" DataSourceID="sdsImages">
<ItemTemplate>
<div class="photo sample12">
<asp:Image ID="img_Galerie" runat="server" ImageUrl='<%# "~/imageHandler.ashx?ID=" + Eval("ImageID") %>' />
</div>
</ItemTemplate>
</asp:ListView>
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="3" QueryStringField="ImageID">
<Fields>
<asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
<asp:NumericPagerField />
<asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
</Fields>
</asp:DataPager>
<asp:SqlDataSource ID="sdsImages" runat="server"
ConnectionString="<%$ ConnectionStrings:DBCS %>"
SelectCommand="SELECT ImageID FROM Images ">
これを試してください:
protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
ListView1.DataSource = productList;
ListView1.DataBind();
DataPager1.DataBind();
}