什么是更好的使用:DataGrid或ListView用于显示大量数据?
我想在表格中显示> 50000行。 哪个是最好的控件:DataGrid或ListView(在详细信息视图中)? 哪些控件具有更好的性能?
正如汉斯在对原始问题的评论中所说的那样,他们都会有糟糕的表现,仅仅是因为你的用户在同时显示如此多的数据线的疯狂情况下肯定会遇到的不满。
但是,如果在您的应用程序中这是不可避免的(并且您提供了非常好的搜索function),那么无论您决定使用哪种控件,都应该强烈考虑使用虚拟模式选项。 这意味着您必须提供自己的数据管理操作,而不是依靠控件为您执行此操作。 优点是事情要快得多。 正如文件所说:
虚拟模式设计用于非常大的数据存储。 当
VirtualMode
属性为true时,您将创建具有一定数量的行和列的DataGridView
,然后处理CellValueNeeded
事件以填充单元格。 虚拟模式需要实现底层数据缓存,以根据用户的操作处理DataGridView单元的填充,编辑和删除。 有关实现虚拟模式的详细信息,请参阅如何:在Windows窗体DataGridView控件中实现虚拟模式 。
或者,对于ListView
控件 :
将
VirtualMode
属性设置为true会将ListView
置于虚拟模式。 在虚拟模式下,未使用正常的Items
集合。 相反,ListViewItem
对象是在ListView需要它们时动态创建的。在许多情况下,虚拟模式很有用。 如果必须从已经在内存中的非常大的集合填充
ListViewItem
对象,则为每个条目创建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
。
50,000行什么都没有,自动排序,过滤,找到键入和其他善良的负载:)
别。 如果你想做这样的事情,加载前500行和最后100行。当用户向下滚动100行时,自动加载下一批。 在Ctrl + End上,显示最后100个,并在用户向上滚动时预加载较早的批次。
玩这些数字,直到你得到一个让用户感觉顺畅的东西而不实际加载50K行