【问题标题】:Do I need to re-retrieve data when paging using asp:GridView使用 asp:GridView 进行分页时是否需要重新检索数据
【发布时间】: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)中时,任何地方都不存在 - 这一切都正确吗?

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

  1. 每次用户使用分页选项时重新执行搜索;
  2. 每次用户使用分页选项时,在第一次搜索检索它们后将搜索结果保存在 Session 中;
  3. 手动将搜索结果插入 ViewState 并在用户每次使用分页选项时检索它们。

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

【问题讨论】:

    标签: asp.net vb.net gridview pagination


    【解决方案1】:

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

    因此,如果您想显示记录 1 到 10,您可以对数据库执行查询,并且只获取这 10 条记录。如果要显示接下来的十个,则使用相应的参数执行另一个查询。

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

    这篇文章可能会让您开始了解如何执行此操作: http://dotnetslackers.com/articles/gridview/Optimized-Paging-and-Sorting-in-ASP-NET-GridView.aspx

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2013-12-19
      • 2015-10-04
      相关资源
      最近更新 更多