代码之家  ›  专栏  ›  技术社区  ›  Ed Swangren

如何有效筛选大型ListViewItemCollection?

  •  1
  • Ed Swangren  · 技术社区  · 16 年前

    所以我有一个列表视图,其上限约为1000个项目。我需要能够使用文本框的TextChanged事件筛选这些项目。我有一些代码可以很好地处理较小数量的项目(~400),但是当我需要重新显示所有1000个项目的完整列表时,它需要大约4秒钟。

    我不会每次都创建新的ListViewItem。相反,我保留一个完整项目集合的列表,然后从中添加。似乎.add方法花费了很长时间。下面是一个小例子:

    this.BeginUpdate();
    foreach (ListViewItem item in m_cachedItems)
    {
        MyListView.Add(item);
    }
    this.EndUpdate;
    

    我只尝试添加缺少的项目(即当前显示的项目与项目总列表之间的差异),但这也不起作用。在这种情况下,当前只显示一个项目,用户清除文本框,我需要显示整个列表。

    我在用这样的大样本从.NET控件中获取性能方面经验不足,因此我真的不知道更好的方法。有没有办法使用.add()方法,或者如果没有,只需要一个更好的通用解决方案?

    4 回复  |  直到 8 年前
        1
  •  2
  •   Jeff Yates    16 年前

    有两件事要解决:

    1. 操作列表内容时关闭排序。
    2. 隐藏列表,这样它就不会尝试绘制。

    第一点是这两个列表操作中最大的性能提升。要实现这一点,只需在修改期间将ListViewItemSorter设置为空,并在末尾将其设置回。

    对于第二个选项,我经常将列表绘制为位图,然后在图片框中显示该位图,这样用户就不会看到列表消失,然后在完成后重新显示列表。

        2
  •  4
  •   Frank Krueger    16 年前

    有更好的方法,你可以使用 VirtualMode 列表视图的。

    该文档应该可以帮助您开始。其想法是只在需要时向ListView提供信息。这些信息是使用事件来检索的。您所要做的就是实现这些事件,并告诉列表视图它包含多少项。

        3
  •  3
  •   sieben    16 年前

    addrange比add快得多

    MyListView.AddRange(items)
    
        4
  •  0
  •   Phil Wright    16 年前

    还要注意,您可以隐藏项目,这样就可以在不删除它们的情况下使它们不可见。所以,在第一次添加所有项目之后,你只需隐藏不再需要的项目,然后显示它们。