在 WinForms 列表框/列表视图控件中显示大量字符串
Posted
技术标签:
【中文标题】在 WinForms 列表框/列表视图控件中显示大量字符串【英文标题】:Displaying a large number of strings in WinForms listbox/listview controls 【发布时间】:2012-12-03 00:51:00 【问题描述】:我的 WinForms UI 包含一个带有两个标签页的标签控件。在一个选项卡上,我需要以允许我的用户在列表中添加、编辑和删除字符串的方式显示最多 100,000 个字符串的列表。在第二个选项卡上,我需要显示第一个选项卡中字符串的“只读”副本。我还需要第二个选项卡上的控件,允许用户将字符串从“只读”列表复制到第二个不相关列表中。
我目前在一个数组中有 100k 个字符串,我的第一个想法是使用列表框来显示它们。我可以遍历数组并将字符串单独添加到第一个选项卡上的列表框中。如果我使用 SuspendLayout() 和 BeginUpdate(),则显示大约需要 1.5 秒。不幸的是,当我向列表框添加超过 65k 项时,会出现垂直滚动条问题(显然这是在 Vista 期间引入的列表框控件中的一个错误)。由于字符串数据未绑定到列表框,因此我基本上将相同的整个数据集添加到第二个选项卡上的另一个列表框。现在,如果我启动我的应用程序,等待将字符串添加到列表框,然后尝试选择第二个选项卡,等待第二个选项卡响应时性能非常慢。我假设这与列表框中的数据量有关。无论如何,一旦第二个标签页开始响应,我就可以在两个标签页之间切换,而且延迟要少得多。
作为测试,我尝试将两个列表框绑定到数组,但从性能的角度来看并没有任何区别。无论如何,滚动错误可能会使列表框成为我无法使用的选项。因此,我在列表模式下尝试了带有单个隐藏列标题的 listview 控件。当我将字符串数据添加为单独的 ListViewItems 时,性能并没有太大的不同。我打算尝试将两个 listview 控件绑定到我的数组,但看起来 listview 控件不支持设计时数据绑定,我不确定如果我自己尝试实现它会产生很大的不同。
我知道 100,000 个字符串(最多)对于用户来说是很多数据要处理,但要求用户能够看到应用程序中的所有字符串数据(最坏的情况是我的 QA 的第一件事团队将开始测试!)。是否有另一种控件可以适应这种数据量和我需要的功能?还是我只是把这一切都搞错了?
【问题讨论】:
【参考方案1】:我们有一个类似的(~exact)问题。 建议的“重新设计”解决方案并不是真正的解决方案。 用户不能真正使用(或不需要)查看“无数”项目的想法绝对不是 100% 正确的,而是做出假设。 在我们的例子中,用户需要能够滚动(查看)许多(100k+)项...... 是的,这是人类使用我们的软件处理有组织的扫描 3D 坐标数据时很容易实现和需要的。
太棒了,仍然需要一个 ListView 控件,它允许大量项目来替换 system.windows.forms.ListBox(在 C# 中使用)。 NET system.windows.forms.ListBox 与 Visual Studio C# 2012 一起提供,允许大型列表但当它的计数接近 ~60,000 +- 时不允许正确滚动。
原来如此!
【讨论】:
【参考方案2】:我认为你永远不会通过一次为用户提供超过 50 个字符串来帮助用户。使用 DataGridView,您可以按需加载,这更适合于此。见VirtualMode。或者,您可以根据用户输入手动将项目加载到列表框,这样会更好。尝试在这方面说服客户,一次拥有 10 万个字符串只会弊大于利。
我确实认为 DataGridViews 将无法显示简单的字符串,但为您提供了在未来提供更多功能(如更多列等)的灵活性。至于如何将大量数据填充到gridiview,进行搜索,上面有很多线程。这里有两个很好的开端
http://www.codeproject.com/Articles/38735/Load-a-billion-rows-in-a-DataGridView
What's better to use: a DataGrid or ListView for displaying large amounts of data?
正如我所说,最好的选择是重新考虑设计..
【讨论】:
以上是关于在 WinForms 列表框/列表视图控件中显示大量字符串的主要内容,如果未能解决你的问题,请参考以下文章