【问题标题】:How to display a large number of rows in a DataGrid如何在 DataGrid 中显示大量行
【发布时间】:2013-02-23 16:36:09
【问题描述】:

我有一个从 DataTable 填充的 WPF DataGrid。到目前为止,我从未有超过 200 条左右的记录,因此 DataGrid 被完美地填充。但是,我现在必须添加对更大数据库的支持。因此,我想向用户显示 200 条记录,然后让他按下某种按钮,以显示接下来的 200 条记录,依此类推。这样我可以更快地加载 DataGrid。

最好的方法是什么?我有一些在 ASP.NET 中分页的经验,但我在 WPF 中从未有过这样的要求。

这是我的 DataGrid 代码:

<DataGrid Name="dgResults" 
                  IsReadOnly="True"
                  AutoGenerateColumns="True"
                  AllowDrop="False"
                  CanUserAddRows="False"
                  CanUserDeleteRows="False"
                  CanUserReorderColumns="False"
                  CanUserResizeColumns="False"
                  CanUserResizeRows="False"
                  CanUserSortColumns="False"
                  Margin="15,10,10,10"
                  Visibility="Collapsed" 
                  ItemsSource="{Binding}"/>

绑定:

dgResults.DataContext = dtResults.AsDataView();

【问题讨论】:

  • 请检查[这个问题][1],有几个答案可以帮助你。 [1]:stackoverflow.com/questions/14793759/…
  • @Woodman - 我已经看过了,但是我不确定分页是否是我想要的解决方案。我刚刚提到它,因为我有 ASP.NET 方面的经验。我更喜欢简单的“显示下 200 个结果”按钮或类似的按钮。
  • "a simple "Show next 200 results"" 实际上意味着“分页”。所以用户使用“数据页面”。您可以搜索此关键字以获取一组可能的解决方案。我在上述主题中的回答涵盖了更高级的场景 - 数据虚拟化,这意味着数据在后台无缝加载。
  • @Woodman - 所以你的意思是这可以通过 SQL 关键字来完成?
  • 不,这当然还不够。原始 WPF DataGrid 不支持分页,所以恐怕您必须以某种方式手动添加此功能。

标签: c# .net wpf database performance


【解决方案1】:

我认为您需要通过实现分页来解决数据访问层中的问题
像这样使用 LinqToSql

var query = yourPersistenceManager.Context<YourTable>();
-- apply filters
query = query.Skip(pageNumber * pageSize).Take(pageSize);

或者如果使用 ADO.Net,您可以使用一些像这样的通用分页查询(在 oracle 中实现)

select * from 
(
     select yourTable.*, rownum row_number from cc1customer 
     where  rownum <= pageSize*pageNumber 
) where row_number > (pageNumber -1) * pageSize

类似SELECT TOP 在 sqlserver 和 ...

一般建议使用ORDER BY 来获取页面之间的一致数据

用户界面层中,您必须在 WPF DataGrid 上手动实现分页
Here 是一篇有用的文章,可能有用

【讨论】:

    【解决方案2】:

    回避问题的一种方法是为用户提供一些搜索条件,他们可以使用这些条件来查找特定结果。至少,用户通常不会翻阅数千个结果,除非他们必须这样做。您可以通过仅返回任何给定搜索的前 X 个结果来利用这一点。您可以使用 TSQL SELECT TOP 200 * 或使用 linq .Take(200) 来限制查询返回的结果数量

    【讨论】:

    • 问题是我对此有严格的要求。用户不使用此功能显然是可以的,但该功能必须为想要浏览结果的奇怪用户提供。
    • @DotNET 那么我仍然会使用搜索方法。如果用户正在寻找特定的东西,请为他们提供找到它的工具。也就是说,我知道如果您坚持要求,这将无济于事。另一种可能是可以接受的方法是为用户提供一个“导出到 CSV”按钮,该按钮返回所有结果,然后用户可以将其加载到 Excel 中并进行他们想要的任何行挖掘,同时仍然减少服务器上的负载。正如 Woodman 所说,正确、全面的分页不是一项简单的任务,需要您付出大量的开发努力
    • 感谢您的意见。顺便说一句,我已经有一个“导出到 CSV”按钮。我也计划尽快添加此功能。
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2011-10-23
    相关资源
    最近更新 更多