1

我的 WinForms UI 包含一个带有两个标签页的标签控件。在一个选项卡上,我需要以允许我的用户在列表中添加、编辑和删除字符串的方式显示最多 100,000 个字符串的列表。在第二个选项卡上,我需要显示第一个选项卡中字符串的“只读”副本。我还需要第二个选项卡上的控件,允许用户将字符串从“只读”列表复制到第二个不相关列表中。

我目前在一个数组中有 100k 个字符串,我的第一个想法是使用列表框来显示它们。我可以遍历数组并将字符串单独添加到第一个选项卡上的列表框中。如果我使用 SuspendLayout() 和 BeginUpdate(),则显示大约需要 1.5 秒。不幸的是,当我向列表框添加超过 65k 项时,会出现垂直滚动条问题(显然这是在 Vista 期间引入的列表框控件中的一个错误)。由于字符串数据未绑定到列表框,因此我基本上将相同的整个数据集添加到第二个选项卡上的另一个列表框。现在,如果我启动我的应用程序,等待将字符串添加到列表框,然后尝试选择第二个选项卡,等待第二个选项卡响应时性能非常慢。我' m 假设这与列表框中的数据量有关。无论如何,一旦第二个选项卡响应,我可以在两个选项卡页面之间切换,延迟要少得多。

作为测试,我尝试将两个列表框绑定到数组,但从性能的角度来看它没有任何区别。无论如何,滚动错误可能会使列表框成为我无法使用的选项。因此,我在列表模式下尝试了带有单个隐藏列标题的 listview 控件。当我将字符串数据添加为单独的 ListViewItems 时,性能并没有太大的不同。我打算尝试将两个 listview 控件绑定到我的数组,但看起来 listview 控件不支持设计时数据绑定,我不确定如果我自己尝试实现它会产生很大的不同。

我知道 100,000 个字符串(最大)对于用户来说是很多数据要处理,但要求用户能够看到应用程序中的所有字符串数据(最坏的情况是我的 QA 团队首先会开始测试!)。是否有另一种控件可以适应这种数据量和我需要的功能?还是我只是把这一切都错了?

4

2 回答 2

1

我认为您不会通过一次为用户提供 50 多个字符串来帮助用户。使用 DataGridView,您可以按需加载,这更适合于此。请参阅虚拟模式。或者,您可以根据用户输入手动将项目加载到列表框,这样会更好。尝试在这方面说服客户,一次拥有 10 万个字符串只会弊大于利。

我确实认为 DataGridViews 将无法显示简单的字符串,但为您提供了在未来提供更多功能的灵活性(如更多列等)。至于如何将大量数据填充到gridiview,进行搜索,上面有很多线程。这里有两个很好的开端

http://www.codeproject.com/Articles/38735/Load-a-billion-rows-in-a-DataGridView

哪个更好用:用于显示大量数据的 DataGrid 或 ListView?

正如我所说,最好的选择是重新考虑设计..

于 2012-12-15T02:08:56.447 回答
0

我们有一个类似的(~exact)问题。建议的“重新设计”解决方案并不是真正的解决方案。用户不能真正使用(或不需要)查看“数以千计”的项目的想法绝对不是 100% 正确的,并且是假设的。在我们的例子中,用户需要能够滚动(查看)许多 (100k+) 项目....是的,这是很容易实现的,人类使用我们的软件来处理有组织的扫描 3D 坐标数据是很容易做到的。

太棒了,仍然需要一个 ListView 控件,它允许大量项目来替换 system.windows.forms.ListBox(如在 C# 中使用的那样)。NET system.windows.forms.ListBox 与 Visual Studio C# 2012 一起提供,允许大型列表但当它的计数接近 ~60,000 +- 时不允许正确滚动。

它就是这样儿的!

于 2014-02-17T23:08:57.457 回答