什么';最好使用DataGrid或ListView来显示大量数据
本文关键字:ListView 显示 数据 DataGrid 什么 | 更新日期: 2023-09-27 17:57:36
我想在一个表中显示>50000行。使用哪种控件最好: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
事件可以在虚拟模式下进行搜索。如果不处理此事件,FindItemWithText
和FindNearestItem
方法将返回null。您可以处理
CacheVirtualItems
事件以维护ListViewItem
对象的缓存。如果创建ListViewItem
对象的计算或查找成本很高,那么维护缓存可以提高性能。如果
View
属性设置为Tile,则当VirtualMode
设置为true时,该值将自动更改为LargeIcon。在虚拟模式下,
Items
集合被禁用。尝试访问它会导致InvalidOperationException
。CheckedItems
集合和SelectedItems
集合也是如此。如果要检索选定或选中的项目,请改用SelectedIndices
和CheckedIndices
集合。
使用ObjectListView项目中的FastObjectListView
。
50000行算不了什么,可以自动排序、过滤、打字查找和加载其他优点:)
不要。如果要执行类似的操作,请加载前500行和最后100行。当用户向下滚动一百行时,自动加载下一批。在Ctrl+End上,显示最后一个100,并预加载前一批,以防用户向上滚动。
玩数字游戏,直到你得到用户感觉流畅的东西,而不需要实际加载50行