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

ale*_*dee 24 .net c# listview datagridview winforms

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

Cod*_*ray 29

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

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

虚拟模式设计用于非常大的数据存储.当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禁用该集合.试图访问它会产生一个InvalidOperationException.CheckedItems收集和SelectedItems收藏也是如此.如果要检索选定或选中的项目,请改用SelectedIndicesCheckedIndices集合.

  • @Akrem:啊,对不起.我以为你是原来的提问者.我真的不知道WPF,但由于其底层技术的不同,很可能它与大量项目没有相同的问题.我从来没有想过一次需要显示超过10,000条记录的人不止一个...... (2认同)
  • @CodyGray"我真的不知道WPF,但由于其底层技术的不同,很可能它与大量项目没有相同的问题".实际上WPF在这方面存在可怕的性能问题,因为从根本上说,它的渲染管道不支持可见性信息和剔除.我已经在我曾经工作的每个主要WPF应用程序上遇到了这个性能问题... (2认同)

Gra*_*ian 14

使用FastObjectListViewObjectListView项目.

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