【发布时间】:2011-11-22 15:53:39
【问题描述】:
我有一个 .aspx 搜索屏幕,它在 asp:GridView 组件中显示搜索结果。搜索最多可以返回大约 1000 条记录。我想在网格上实现分页,以便在任何时候只显示 15 条记录,并且用户可以对结果进行分页。
我通过将搜索参数传递给返回特定实体对象列表的 WCF 服务来检索记录。我创建一个 Datatable 并从 List 中为每个实体对象插入一个 DataRow。然后我将网格视图绑定到数据表。
这就是我的网格在 .aspx 页面中的定义方式:
<asp:GridView ID="gridCat" runat="server" AutoGenerateColumns="False" DataKeyNames="CatalogueID"
HeaderStyle-CssClass="fieldHeading" RowStyle-CssClass="fieldContent"
AlternatingRowStyle-CssClass="alternateFieldContent" Width="100%"
AllowPaging="True" AllowSorting="True" AutoGenerateDeleteButton="True"
PageSize="15">
而且我在后面的代码(.aspx.vb 文件)中也有这个方法:
Sub GridPagingAction(ByVal sender As Object, ByVal e As GridViewPageEventArgs) Handles gridCat.PageIndexChanging
gridCat.PageIndex = e.NewPageIndex
gridCat.DataBind()
gridCat.Visible = True
End Sub
我的问题是:第一页正确呈现,即前 15 条记录正确显示。但是,当我导航到网格中的第 2 页时,GridPagingAction 方法在服务器上被击中,但网格中没有显示任何内容 - 它只是空白。
我认为发生这种情况的原因是,当第二页的请求到达服务器时,Datatable 不再存在于服务器上——对吗?而 asp:GridView 在呈现结果的第一页时,仅从 Datatble 中获取前 15 条记录并将它们发送回浏览器。因此,当第二页的请求出现在其他记录(即记录 16 - 1000)中时,任何地方都不存在 - 这一切都正确吗?
如果是这样,最好的解决方案是什么 - 如果不执行以下操作之一,我看不到如何实现分页:
- 每次用户使用分页选项时重新执行搜索;
- 每次用户使用分页选项时,在第一次搜索检索它们后将搜索结果保存在 Session 中;
- 手动将搜索结果插入 ViewState 并在用户每次使用分页选项时检索它们。
有没有更好的方法来做到这一点(或者我做错了)?如果不是,您认为这 3 个选项中哪个是最好的?我倾向于选项 2,因为我认为选项 1 的性能不佳,并且我不想按照选项 3 将大量不必要的数据发送回浏览器。
【问题讨论】:
标签: asp.net vb.net gridview pagination