asp.net – 使用asp:GridView进行分页时是否需要重新检索数据?

我有一个.aspx搜索屏幕,在asp:GridView组件中显示搜索结果.搜索返回的记录最多可达1000条.我想在网格上实现分页,这样一次只能显示15条记录,用户可以翻阅结果.

我通过将搜索参数传递给WCF服务来检索记录,该服务返回特定实体对象的List.我创建一个Datatable并从List中为每个实体对象插入一个DataRow.然后我将网格视图绑定到Datatable.

这是我的网格在.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方法在服务器上被命中,但网格中没有显示任何内容 – 它只是空白.

我认为发生这种情况的原因是因为当第二页的请求命中服务器时,服务器上的数据表不再存在 – 是吗?而asp:GridView在渲染结果的第一页时,只从Datatble获取前15条记录并将它们发送回浏览器.因此,当第二页的请求进入其他记录(即记录16-1000)时,在任何地方都不存在 – 这是正确的吗?

如果是这样,什么是最好的解决方案 – 我无法看到如何实现分页而不必执行以下操作之一:

>每次用户使用分页选项时重新执行搜索;
>每次用户使用分页选项时,在第一次搜索后将搜索结果保存在会话上;
>手动将搜索结果插入ViewState,并在每次用户使用分页选项时检索它们.

有没有更好的方法来做到这一点(或者我做错了)?如果没有,您认为哪3个选项最好?我倾向于选项2,因为我不认为选项1是高性能的,我不希望按照选项3将大量不必要的数据发送回浏览器.

最佳答案 你说的都是正确的.您可以使用ViewState或Session来保持客户端或服务器端的数据,但如果您确实拥有那么多记录,那么仅收集您实际需要的数据可能是个好主意.

因此,如果要显示记录1到10,则对数据库执行查询,仅获取这10个记录.如果要显示下一个十,则使用相应参数执行另一个查询.

这将显着提高您的性能和内存使用率,如果调用您的数据库并不是太昂贵.

本文可能会为您提供如何执行此操作的开始:
http://dotnetslackers.com/articles/gridview/Optimized-Paging-and-Sorting-in-ASP-NET-GridView.aspx

如果你想要一个简单的解决方案而不需要任何额外的努力,我会查询每个回发的所有记录(你的选项#1).
如果您想要性能最佳的解决方案并且开销不大,请使用自定义分页.

点赞