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