好的,所以我理解如何使用ASP.net GridView控件的分页。您可以设置各种方法以允许控件获取数据的子集,以及总共匹配的记录数。这是我目前的初始化代码:
ObjectDataSource dataSource = new ObjectDataSource();
dataSource.EnablePaging = true;
dataSource.SelectParameters.Add(new Parameter("customerId", TypeCode.Int32, customerId.ToString()));
dataSource.SelectMethod = "SelectSomeRecords";
dataSource.StartRowIndexParameterName = "startRowIndex";
dataSource.MaximumRowsParameterName = "maximumRows";
dataSource.SelectCountMethod = "SelectAllRecordsCount";
dataSource.TypeName = "Name.Of.Data.Class";
grdUserList.DataSource = dataSource;
grdUserList.DataBind();
这适用于它将我正在显示用户的客户ID传递给我的数据类,以及启动行索引和最大行。但有一件事困扰着我。为什么控件需要SelectCountMethod
的单独方法?在数据库层,我有一个存储过程,它返回匹配行的总数作为输出参数以及请求的子集。如果DataGrid只允许我的SelectMethod
返回一个int,则表示在应用startRowIndex
和maximumRows
之前匹配的记录总数会更容易。
This MSDN page似乎建议(在其示例中)应该将记录数存储在HttpRuntime.Cache
中,过期时间为5分钟。在我看来,这似乎是一个远非完美的解决方案。当您在调用SelectMethod
的同时获取匹配的记录总数时,您可能已经有5分钟的旧数据发生了变化!无论如何,您将在渲染分页控件的同时想要获取该信息。
我的问题是,有没有办法让GridView在调用'select方法'的同时通过返回值或out参数获取其“所有记录计数”数字?如果没有,你会如何建议解决这两个数据有两种方法的奇怪要求,因为我打电话给SelectMethod
时我会得到“所有记录数”?目前,我倾向于在会话中存储该值,将其设置为SelectMethod
,然后将其返回SelectCountMethod
。
答案 0 :(得分:1)
只是为了更新,我最终做的是编写自己的分页类,并且一次只向GridView
提供一页信息。我发现它的内置分页机制很难实现。使用自己的分页类的额外好处是,您可以将其与其他没有内置分页的ASP.net控件一起使用,例如Repeater。