サーバー側のページングを行うために DataPager を使用しようとしています。これが私のコードです
<asp:DataPager ID="pgrFooBars" PagedControlID="lvFooBars"
QueryStringField="page" runat="server" >
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
コードビハインド
protected void Page_Load(object sender, EventArgs e)
{
ConfigureBlogPostListView();
}
private void ConfigureBlogPostListView()
{
int pageNum;
int.TryParse(Request.Params["page"], out pageNum);
int pageSize = 20;
PagedList<IFooBar> FooBars = FooService.GetPagedFooBars(
new PagingSettings(pageNum, pageSize));
ListViewPagedDataSource ds = new ListViewPagedDataSource();
ds.AllowServerPaging = true;
ds.DataSource = FooBars;
ds.MaximumRows = pageSize;
ds.StartRowIndex = pageNum;
//TotalCount is the total number of records in the entire set, not just those loaded.
ds.TotalRowCount = FooBars.TotalCount;
lvFooBars.DataSource = ds;
lvFooBars.DataBind();
pgrFooBars.PageSize = pageSize;
pgrFooBars.SetPageProperties(pageNum, FooBars.TotalCount, true);
}
PagedList は、RobConery の有用な投稿http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/から取得されます。
問題は、DataPager が ListView の Count プロパティを使用して合計レコード数 (この場合は 20) を判断しているように見えることです。どういうわけか、合計レコード数が 20 ではなく、1,500 であることを知る必要があります。DataPager にはプロパティ TotalRowCount がありますが、これは読み取り専用です。
サーバー サイド ページングを使用した DataPager の例を見たことはありませんが、サーバー サイド ページングを実行できると想定していました。
4GuysFromRolla がここで行ったような方法論を使用してカスタム ページング ソリューションを実行できることは承知していますhttp://www.4guysfromrolla.com/articles/031506-1.aspxが、DataPager を使用したソリューションかどうかを最初に知りたいです。カスタム ソリューションを作成する前に可能です。
更新 これを調べれば調べるほど、これは不可能であり、残念ながらデータページャーは小さな Web サイト専用のコントロールであるという結論に達しています。コントロールが正しく構築されていれば、私がやりたいことは非常に単純なはずです。言えるようになりたい
dpFooBars.TotalRowCountComputed = false;
dpFooBars.TotalRowCount = AnyNumberThatISoChoose;
同じことを達成するためのハックを探していましたが、データページャーの TotalRowCount は、バインドされているデータソース内の実際のアイテム数から計算されるようです。Microsoft が ListViewPagedDataSource() クラスと DataPager を同時に作成し、それらを正しく連携させないというのは非常に奇妙に思えますが、これが実際に起こったことのようです。
更新 2 (AHA MOMENT?) ObjectDataSource を使用して SelectCountMethod() をカスタマイズすることにより、.Net 2.0 以降、サーバー側のページングを行うことが可能になったようです。私のニーズに合わせて ObjectDataSource をカスタマイズできるはずです。うーん。私は週末に出かけるので、これが機能するかどうかを確認するのに数日かかります. 真の信者の皆さん、お楽しみに。