我正在尝试使用 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。不知何故,它需要知道有 1,500 条记录,而不是 20 条记录。DataPager 有一个属性 TotalRowCount,但这是只读的。
我从未见过带有服务器端分页的 DataPager 示例,但假设它可以进行服务器端分页,否则 QueryStringField 属性有什么用?
我知道您可以使用 4GuysFromRolla 在这里http://www.4guysfromrolla.com/articles/031506-1.aspx所做的方法来执行自定义分页解决方案,但我首先想知道是否有 DataPager 的解决方案在创建自定义解决方案之前是可能的。
更新 我看的越多,我就越得出这样的结论,即这是不可能的,不幸的是,datapager 是一个仅适用于小型网站的控件。如果控件构建正确,我想要做的应该非常简单。我想能够说
dpFooBars.TotalRowCountComputed = false;
dpFooBars.TotalRowCount = AnyNumberThatISoChoose;
我一直在寻找一些技巧来完成同样的事情,但似乎 datapager 的 TotalRowCount 是根据它绑定到的数据源中的实际项目数计算的。微软会同时创建一个 ListViewPagedDataSource() 类和一个 DataPager 并且没有让它们一起正常工作,这对我来说似乎很奇怪,但这似乎已经发生了。
UPDATE 2 (AHA MOMENT?) 自.Net 2.0 以来,似乎可以通过使用 ObjectDataSource 并自定义 SelectCountMethod() 来进行服务器端分页。我相信应该可以自定义 ObjectDataSource 以满足我的需要。嗯。我周末要离开,所以我需要几天时间看看这是否有效。请继续关注,真正的信徒。