Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';使用DataGrid或ListView显示大量数据更好吗?_C#_.net_Winforms_Listview_Datagridview - Fatal编程技术网

C# 什么';使用DataGrid或ListView显示大量数据更好吗?

C# 什么';使用DataGrid或ListView显示大量数据更好吗?,c#,.net,winforms,listview,datagridview,C#,.net,Winforms,Listview,Datagridview,我想在一个表中显示>50000行。使用哪个控件最好:DataGrid还是ListView(在详细信息视图中)?这些控件中哪一个性能更好?正如Hans在对原始问题的评论中所说,它们的性能都将非常糟糕,只有用户对同时显示这么多行数据的疯狂感到的不快才能超越它们 但如果在应用程序中不可避免(并且提供了非常好的搜索功能),那么您应该强烈考虑使用虚拟模式< /强>选项,而不管您决定使用哪种控件。这意味着您必须提供自己的数据管理操作,而不是依赖控件来为您提供。优点是速度快得多。正如政府所说: 虚拟模式设计用

我想在一个表中显示>50000行。使用哪个控件最好:DataGrid还是ListView(在详细信息视图中)?这些控件中哪一个性能更好?

正如Hans在对原始问题的评论中所说,它们的性能都将非常糟糕,只有用户对同时显示这么多行数据的疯狂感到的不快才能超越它们

但如果在应用程序中不可避免(并且提供了非常好的搜索功能),那么您应该强烈考虑使用<强>虚拟模式< /强>选项,而不管您决定使用哪种控件。这意味着您必须提供自己的数据管理操作,而不是依赖控件来为您提供。优点是速度快得多。正如政府所说:

虚拟模式设计用于非常大的数据存储。当
VirtualMode
属性为true时,您将创建一个具有设置数量的行和列的
DataGridView
,然后处理以填充单元格。虚拟模式需要实现底层数据缓存,以根据用户的操作处理DataGridView单元格的填充、编辑和删除。有关实现虚拟模式的更多信息,请参阅

或:

VirtualMode
属性设置为true将
ListView
置于虚拟模式。在虚拟模式下,正常集合未使用。相反,对象是根据ListView的要求动态创建的

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

要使用虚拟模式,您必须处理,每当
列表视图
需要一个项目时,都会引发。此事件处理程序应创建属于指定索引的
ListViewItem
对象。此外,必须将设置为虚拟列表的大小

处理将启用虚拟模式下的搜索。如果未处理此事件,则和方法将返回null

您可以处理以维护
ListViewItem
对象的缓存。如果创建
ListViewItem
对象的计算或查找成本很高,则维护缓存可以提高性能

如果设置为平铺,则当
VirtualMode
设置为true时,该值将自动更改为LargeIcon

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


不要。如果要执行类似操作,请加载前500行和最后100行。当用户向下滚动100行时,自动加载下一批。在Ctrl+End上,显示最后100个,并预加载早期批次,以防用户向上滚动


在不实际加载50K行的情况下播放数字,直到用户感觉平滑为止。使用项目中的
FastObjectListView


50000行不算什么,自动排序、过滤、通过键入查找和加载其他优点:)

为什么不显示分页数据,而不是一起显示>50000行。这样的数字没有“更好”的地方。最好是50行,这是一个人在不想卸载程序的情况下可以读取的行数。测试两种解决方案并查看结果。我最近使用DataGridView显示了超过30万行(如果用户这样选择数据的话),并且没有注意到任何性能问题(如果禁用列的自动调整大小)。当然会有一些延迟,但对于如此大量的数据,这是可以接受的。这一切都取决于你的项目。LOL+1@mj82的“当然会有一些延迟”这当然是虚拟模式允许你实现的。绝对不要通过捕捉
KeyDown
事件或其他方式手动执行此操作。那太脆弱了。用户滚动控件的方式有很多种。而且这也不利于实现搜索功能,而搜索功能对于这种数量的数据来说是绝对重要的。@Cody:酷!我不知道虚拟模式。我同意这显然是一条路要走。对于搜索功能,我不理解这个问题。它不应该在db本身而不是DGV上实现吗?我对这个解决方案做了一些研究,发现虚拟模式在WPF中不存在:/有任何方法可以在WPF@Akrem:那很有趣。你的问题根本没有提到WPF。事实上,我给它添加了
winforms
,因为它看起来像是在谈论winforms控件,而不是WPF控件。我想那是个错误。不,我不知道WPF。如果你把问题贴上WPF标签,我就不会回答了。@Akrem:啊,对不起。我以为你是最初的询问者。我真的不知道WPF,但由于其底层技术的不同,它在大量项目上可能没有相同的问题。我从来没有想到会有超过一个人一次需要显示10000条以上的记录…@Akrem:好吧,如果用户请求了那么多记录,而它的性能却因此而不佳,那是他们自己的错。虚拟模式对数据库的压力没有帮助,它只会帮助应用程序对美国市场保持更高的响应速度