什么是更好的使用: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事件可以在虚拟模式下进行搜索。 如果未处理此事件,则FindItemWithTextFindNearestItem方法将返回null。

您可以处理CacheVirtualItems事件以维护ListViewItem对象的缓存。 如果计算或查找以创建ListViewItem对象非常昂贵,则维护缓存可以提高性能。

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

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

使用ObjectListView项目中的FastObjectListView

50,000行什么都没有,自动排序,过滤,找到键入和其他善良的负载:)

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

玩这些数字,直到你得到一个让用户感觉顺畅的东西而不实际加载50K行