使用什么更好:DataGrid或ListView用于显示大量数据?

时间:2011-05-22 17:46:05

标签: c# .net winforms listview datagridview

我想在表格中显示> 50000行。哪个是最好的控件:DataGrid或ListView(在详细信息视图中)?哪些控件具有更好的性能?

3 个答案:

答案 0 :(得分:29)

正如汉斯在对原始问题的评论中所说的那样,他们都会有糟糕的表现,仅仅是因为你的用户在同时显示如此多的数据线的疯狂情况下肯定会遇到的不满

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

  

虚拟模式设计用于非常大的数据存储。当VirtualMode属性为true时,您创建一个具有设定行数和列数的DataGridView,然后处理CellValueNeeded event以填充单元格。虚拟模式需要实现底层数据缓存,以根据用户的操作处理DataGridView单元的填充,编辑和删除。有关实施虚拟模式的更多信息,请参阅How to: Implement Virtual Mode in the Windows Forms DataGridView Control

或者,对于ListView control

  

VirtualMode属性设置为true会将ListView置于虚拟模式。在虚拟模式下,正常的Items集合未使用。而是,ListViewItem对象是动态创建的,因为ListView需要它们。

     

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

     

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

     

处理FindItemWithText可以在虚拟模式下进行搜索。如果未处理此事件,则FindNearestItemCacheVirtualItems event方法将返回null。

     

您可以处理View property以维护ListViewItem个对象的缓存。如果用于创建VirtualMode对象的计算或查找很昂贵,则维护缓存可以提高性能。

     

如果Items设置为Tile,则当{{1}}设置为true时,该值将自动更改为LargeIcon。

     

在虚拟模式下,InvalidOperationException集合已禁用。尝试访问它会产生CheckedItemsSelectedItems集合和SelectedIndices集合也是如此。如果您要检索所选或已检查的项目,请改用CheckedIndices和{{3}}集合。

答案 1 :(得分:14)

使用ObjectListView项目中的FastObjectListView

50,000行没什么,有自动排序,过滤,按类型查找和其他善良的负载:)

答案 2 :(得分:0)

别。如果你想做这样的事情,加载前500行和最后100行。当用户向下滚动100行时,自动加载下一批。在Ctrl + End上,显示最后100个,并在用户向上滚动时预先加载早期批次。

使用这些数字,直到您获得对用户感觉顺畅的内容而不实际加载50K行