2010-06-29 84 views
4

我有一个列表视图,它用作简单搜索应用程序的索引。索引中的每个项目都是一个单词,然后单击该项目将该项目添加到搜索文本框中。用户可以先点击他/她喜欢的任何单词,然后单击搜索,然后在文档中搜索。 问题是,向ListView添加超过1000个左右的项目需要很多运行时间! 我设计了一个进度条并添加了一个计时器,该计时器在窗体加载后立即开始将项目添加到列表视图中。这给应用程序提供了响应,但效率仍然很低。 我怀疑索引中可能有大约100,000个单词,当文档基数增长足够多时,我需要更有效的方法来完成此操作。也许我需要改变ListView组件到别的东西。 这是计时器的代码项目添加到列表视图:将大量项目添加到列表视图

if (!listViewDone) 
     { 
      int pos = 0; 
      ListView listView1 = Search.getInstance().getListView(); 
      listView1.BeginUpdate(); 
      for (pos = listViewPos; pos < termf.Count && pos < listViewPos + listViewChunk; ++pos) 
      { 
       TermFreq t = termf[pos]; 
       listView1.Items.Add(new ListViewItem(new String[] { t.term })); 
       progressBar1.Value = pos; 
      } 
      listView1.EndUpdate(); 
      listViewPos = pos; 

      if (pos == termf.Count) 
      { 
       listViewDone = true; 
       termf = null; 
       timer1.Enabled = false; 
       Visible = false; 
      } 
     } 

回答

3

正如hmemcpy提到的那样,VirtualMode会大大提高速度。我不确定项目的商业性质,但我使用了优秀的开源ObjectListView,其中包括FastObjectListView变体。

这基本上是一个扩展的虚拟ListView,它非常快速,并且作为一个额外的好处是更好的工作。文件声称它“可以在0.1秒内建立10,000个物品的清单”,而且我无法证明这一点,只要我使用它,我从来没有注意到任何严重的滞后。尽管如此,授权​​可能会成为一个问题。

2

不要使用列表视图,这并不意味着要处理这么多项目,甚至有完美的表现会惹恼你的用户。考虑使用自动完成的文本框。

+2

客户要求这样的观点。他有一个类似的申请与上市指数。不同之处在于客户可以在不输入任何内容的情况下查看索引中的内容,只需滚动即可。 – 2010-06-29 04:32:09

+0

虽然最终你必须做他们所说的话,但我仍然建议把其他选项放在他们面前。也许用全部显示按钮弹出一个全屏列表。 (事实上​​,我可能会为我的项目做到这一点。) – 2010-06-30 00:34:54

0

我检查了列表框而不是listview及其方式更快!整个过程不到一秒钟,至少是30倍。

2

如果您需要在ListView中显示很多项目,最好的选择是使用ListView的Virtual Mode。这样你的ListView将只显示可见的项目。