我的WinForms UI包含一个带有两个选项卡页的选项卡控件。在一个选项卡上,我需要以允许我的用户在列表中添加、编辑和删除字符串的方式显示最多100,000个字符串的列表。在第二个选项卡上,我需要显示第一个选项卡中字符串的“只读”副本。我还需要第二个选项卡上的控件,允许用户将字符串从“只读”列表复制到第二个不相关的列表中。
我目前在一个数组中有100k个字符串,我的第一个想法是使用列表框来显示它们。我可以遍历数组并将字符串单独添加到第一个选项卡上的列表框中。如果我使用SuspendLayout()和BeginUpdate(),它大约需要1.5秒才能显示。不幸的是,当我在一个列表框中添加超过65k个项目时,会出现垂直滚动条问题(显然这是在Vista时代引入的listbox控件中的一个bug )。由于字符串数据没有绑定到列表框,因此我基本上是将相同的整个数据集添加到第二个选项卡上的另一个列表框中。现在,如果我启动我的应用程序,等待字符串被添加到列表框中,然后尝试选择第二个选项卡,等待第二个选项卡响应时,性能会非常慢。我假设这与列表框中的数据量有关。无论如何,一旦第二个选项卡开始响应,我就可以在两个选项卡页面之间切换,而延迟要小得多。
作为测试,我尝试将两个列表框都绑定到数组,但从性能的角度来看没有任何区别。滚动错误可能会使列表框对我来说是一个无法使用的选项。因此,我在列表模式下尝试了listview控件,它只有一个隐藏的列标题。当我将字符串数据作为单独的ListViewItems添加时,性能没有太大差别。我打算尝试将两个listview控件绑定到我的数组中,但是看起来listview控件不支持设计时数据绑定,并且我不确定如果我尝试自己实现它会有多大的不同。
我知道100,000个字符串(最多)对于用户来说是一个很大的数据处理,但这是一个要求用户能够看到应用程序中的所有字符串数据(最坏的情况是我的QA团队开始测试的第一件事!)。有没有另一个控件可以提供我所需要的数据量和功能?还是说我做错了?
发布于 2012-12-15 02:08:56
我认为你不会通过一次为用户提供超过50个字符串来帮助用户。使用DataGridView,您可以按需加载,这更适合于此。参见VirtualMode。或者你也可以在用户输入时手动将项目加载到列表框中,这样会更好。试着说服这方面的客户,一次100k的字符串只会弊大于利。
我确实认为DataGridViews将无法显示简单的字符串,但它为您提供了灵活性,可以在未来提供更多功能(如更多列等)。至于如何将如此大量的数据填充到网格视图中,进行搜索,有很多线索。这里有两个很好的开始
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?
正如我所说的,最好的选择是重新考虑设计..
发布于 2014-02-17 23:08:57
我们有一个类似的(~精确)问题。“重新设计”的建议解决方案并不是真正的解决方案。认为用户不能真正使用(或不需要)查看大量项目的想法绝对不是100%正确的,而且是在做假设。在我们的示例中,用户需要能够滚动(参见)许多(100k+)项目...是的,这是很容易实现的&人类需要使用我们的软件来处理有组织的扫描3D坐标数据。
所以,仍然需要一个允许替换system.windows.forms.ListBox (就像C#中使用的)的大量项的ListView控件。Visual Studio C# 2012提供的NET system.windows.forms.ListBox允许大列表,但当项目计数接近~60,000 +-时,不允许正确滚动。
事情就是这样的!
https://stackoverflow.com/questions/13888520
复制相似问题