如何将显示的 sql 数据加载到 wpf 可滚动列表视图中?大型集合(20k+)而不会遇到内存问题?
Posted
技术标签:
【中文标题】如何将显示的 sql 数据加载到 wpf 可滚动列表视图中?大型集合(20k+)而不会遇到内存问题?【英文标题】:how to load displayed sql data into wpf scrollable list view? large collection (20k+) without running into memory problems? 【发布时间】:2014-03-15 15:39:54 【问题描述】:我在 sql 数据库中有一个大型集合。当我使用DataSet
时,我假设我正在一次提取所有(当我说全部时,我的意思是 20000+)数据库条目以填充可滚动的 WPF 列表视图。当我提取那么多数据并添加更多数据时,我的内存不足。
我在这里问了一个类似的问题:program using up all memory from listview sql table, how to populate with only the relevant data? 我需要将它与列表视图一起使用。
如何只在用户滚动时提取我需要的数据? DataRead
会在这里工作吗?我看过有关 DataRead 的教程,但它们通常是基于按钮的,我需要根据用户在列表视图中滚动的方向动态读取数据。
有没有办法让它根据比如 30 个值进行更新,如果用户看到其中的 15 个,那么服务器查询和返回值之间的延迟不会导致列表视图出现任何问题,因为用户向上或向下滚动?
【问题讨论】:
WPF 内置了 UI 虚拟化,假设你没有破坏它,我不会太担心 UI。您正在寻找数据虚拟化,这是一个不同的概念,与 UI 无关。 好的。在任何地方都有这样的例子吗?我很难想象我是唯一一个以前都问过这个问题的人,或者想用列表视图来做这个 【参考方案1】:请查看下一个链接Data virtualization in codeProject
【讨论】:
看到这篇文章和其他zagstudio.com/blogfiles/52/DataVirtualization.pdf【参考方案2】:我假设我一次提取所有(当我说全部时,我的意思是 20000+)数据库条目以填充可滚动的 WPF 列表视图
为什么?你能想象有人同时分析 20000 多个元素吗?您是否希望您的用户一次查看 20000 多个元素?您应该有充分的理由一次提取整个数据集。 “为用户显示”很少是这样的原因。
这类问题通常有两种处理方式:
-
Pagination。为了改善用户体验,您始终可以预先获取几个额外的页面,以便页面之间的转换是无缝的。
Virtualization。大多数 WPF 控件都内置了此功能 (can be easily enabled)。除非您更改了
ListView
ItemContainer
(从 VirtualizingStackPanel
更改为其他内容)或手动禁用虚拟化,否则它应该可以正常工作。
在 SQL 方面,您希望使用 limit 和 offset 进行查询,以在运行时决定应获取数据集的哪一部分。
【讨论】:
显示数据的虚拟化不是问题。 OP 正在努力解决导致内存问题的非常大的 ObservableCollection。使用 DataGrid 或其他基于 VirtualizingStackPanel 的控件之一来虚拟化视口。但是,当后备数据模型变得太大时,就会出现问题。它实际上与尝试查看数据无关——只是数据存在于 ObservableCollection 中。我自己也有同样的问题。以上是关于如何将显示的 sql 数据加载到 wpf 可滚动列表视图中?大型集合(20k+)而不会遇到内存问题?的主要内容,如果未能解决你的问题,请参考以下文章