WPF数据表格:延迟加载/无限滚动

10

我使用DataGrid填充了250行数据。当用户使用滚动条向下滚动(例如低于75%时),我想从数据库中获取下一批250行数据,以此类推。这样做的想法是,即使网格有数百万个结果,我们也不想一次性加载它们,直到用户请求它们为止。是否有现成的机制可以实现这一点?

编辑:因为似乎存在很多混淆:我不是在寻找标准的数据虚拟化解决方案,我已经使用了它们。但是它们都需要您事先指定“虚拟行”的数量,而该查询对我来说代价太高。它们需要这样做的原因是,当您知道网格中的总项目数时,计算当前页面/偏移量/等等变得更加容易。但是它是一个非常昂贵的SQL查询,所以我想迁移到另一种解决方案,可以跳过COUNT()查询。


可能是使用WPF数据网格进行延迟加载的重复问题。 - sll
你正在使用WPF 3.5或WPF 4吗? - sll
@Joshua 你是在问UI虚拟化还是数据虚拟化?如果是UI,下面的答案是正确的。如果是数据,sll发布的链接是正确的。 - Rachel
Joshua在问题中提到虚拟化会节省关闭投票并可以防止在该方向上的努力浪费。 - H H
@H.B. 我已经使用了与该博客中所示完全相同的代码。我的网格有一百万个虚拟行,只有当它们滚动到视图中时,它们的内容才会被填充(通过 SQL)。但是所有这些解决方案都要求您事先知道总行数,我正在寻找一种可以动态增加行数而不是虚拟化它们的方法。 - Maestro
显示剩余3条评论
2个回答

5
看起来DataGrid的虚拟化属性对你没有帮助,因为它需要一个完整的数据集在ItemsSource中。
因此,为了实现数据的懒加载(参见文章数据虚拟化),您可以处理ScrollViewer.ScrollChanged事件并应用经典的服务器端分页方法。基本上,您必须定义和计算诸如页面大小页码排序顺序之类的标志,这样您就可以从数据库请求所需的数据集并在UI上显示它。每当当前页码排序顺序发生变化时,您需要请求数据并更新网格的ItemsSource,也许您还需要恢复滚动位置,但我不确定。
  • 计算可见项的数量
  • 使用参数化查询向数据库进行数据请求,参数包括PageNumber、PagiSize
  • 通过刚刚加载的数据项更新DataGrid ItemsSource

我认为主要的挑战是计算页面大小和当前页码的值。我相信逻辑滚动模式可以帮助您解决这个问题。


谢谢。恐怕你说得对,我必须自己编写这个逻辑。我真的希望有现成的组件或示例代码可以作为基础使用。 - Maestro
你有机会尝试过这个 Muis 吗? - Shankar Raju

-1

将DataGrid的EnableRowVirtualization属性设置为true

因此,当用户滚动时,行将被加载,因此只有可见的行实际上会被加载


我目前在网格中使用数据虚拟化,但它强制我知道总共有多少行,而对于某些查询,我不想计算那个。 - Maestro
6
您似乎没有理解问题,虚拟化只在需要时创建数据的视觉表示,问题是如何仅在需要时获取该数据,这完全是另一个层面的问题。 - H.B.
1
现在我明白问题了,因为你的编辑使它更清晰了 :) 对不起误导了你 :/ - Damascus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接