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

时间:2011-09-22 09:11:01

标签: asp.net vb.net gridview pagination

我有一个.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)时,在任何地方都不存在 - 这是正确的吗?

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

  1. 每次用户使用分页选项时重新执行搜索;
  2. 每次用户使用分页选项时,
  3. 在第一次搜索后将搜索结果保存在会话上;
  4. 手动将搜索结果插入ViewState,并在每次用户使用分页选项时检索它们。
  5. 有没有更好的方法来做到这一点(或者我做错了)?如果没有,您认为哪3个选项最好?我倾向于选项2,因为我不认为选项1是高性能的,我不希望按照选项3将大量不必要的数据发送回浏览器。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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