什么';最好使用DataGrid或ListView来显示大量数据

本文关键字:ListView 显示 数据 DataGrid 什么 | 更新日期: 2023-09-27 17:57:36

我想在一个表中显示>50000行。使用哪种控件最好:DataGrid还是ListView(在详细信息视图中)?以下哪种控件的性能更好?

什么';最好使用DataGrid或ListView来显示大量数据

正如Hans在对最初问题的评论中所说,它们的性能都将非常糟糕,只有用户对同时显示这么多行数据的疯狂感到不满。

但是,如果这在您的应用程序中是不可避免的(并且您提供了非常好的搜索功能),那么无论您决定使用哪个控件,都应该强烈考虑使用虚拟模式选项。这意味着您必须提供自己的数据管理操作,而不是依赖控件来为您进行操作。优点是速度要快得多。正如文件所说:

虚拟模式是为使用非常大的数据存储而设计的。当VirtualMode属性为true时,将创建一个具有设定行数和列数的DataGridView,然后处理CellValueNeeded事件以填充单元格。虚拟模式需要实现底层数据缓存,以根据用户的操作处理DataGridView单元格的填充、编辑和删除。有关实现虚拟模式的详细信息,请参阅如何:在Windows窗体DataGridView控件中实现虚拟模式。

或者,对于ListView控制:

VirtualMode属性设置为true将使ListView进入虚拟模式。在虚拟模式下,正常的Items集合未使用。相反,ListViewItem对象是根据ListView的需要动态创建的。

虚拟模式在许多情况下都很有用。如果ListView对象必须从内存中已经存在的非常大的集合中填充,那么为每个条目创建一个ListViewItem对象可能是浪费。在虚拟模式下,只创建所需的项目。在其他情况下,可能需要频繁地重新计算ListViewItem对象的值,对整个集合执行此操作会产生不可接受的性能。在虚拟模式下,只计算所需的项目。

为了使用虚拟模式,您必须处理RetrieveVirtualItem事件,每次ListView需要一个项时都会引发该事件。此事件处理程序应创建属于指定索引的ListViewItem对象。此外,VirtualListSize属性必须设置为虚拟列表的大小。

处理SearchForVirtualItem事件可以在虚拟模式下进行搜索。如果不处理此事件,FindItemWithTextFindNearestItem方法将返回null。

您可以处理CacheVirtualItems事件以维护ListViewItem对象的缓存。如果创建ListViewItem对象的计算或查找成本很高,那么维护缓存可以提高性能。

如果View属性设置为Tile,则当VirtualMode设置为true时,该值将自动更改为LargeIcon。

在虚拟模式下,Items集合被禁用。尝试访问它会导致InvalidOperationExceptionCheckedItems集合和SelectedItems集合也是如此。如果要检索选定或选中的项目,请改用SelectedIndicesCheckedIndices集合。

使用ObjectListView项目中的FastObjectListView

50000行算不了什么,可以自动排序、过滤、打字查找和加载其他优点:)

不要。如果要执行类似的操作,请加载前500行和最后100行。当用户向下滚动一百行时,自动加载下一批。在Ctrl+End上,显示最后一个100,并预加载前一批,以防用户向上滚动。

玩数字游戏,直到你得到用户感觉流畅的东西,而不需要实际加载50行