如何有效地过滤大型LIstViewItemCollection?

时间:2008-10-04 01:50:58

标签: c# .net winforms performance listview

所以我有一个ListView,其上限约为1000个项目。我需要能够使用文本框的TextChanged事件过滤这些项目。我有一些代码适用于较少数量的项目(~400),但当我需要重新显示所有1000个项目的完整列表时,大约需要4秒。

我不是每次都创建新的ListViewItems。相反,我保留了完整项目集合的列表,然后从中添加。无论如何,.Add方法似乎需要很长时间。这是一个小样本:

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

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

我对使用像这样的大样本的.NET控件的性能不是很有经验,所以我真的不知道更好的方法。有没有办法使用.Add()方法,或者如果没有,只是更好的通用解决方案?

4 个答案:

答案 0 :(得分:4)

有一种更好的方法,您可以使用列表视图的VirtualMode

该文档应该可以帮助您入门。我们的想法是仅在需要时向ListView提供信息。使用事件检索此类信息。您所要做的就是实现这些事件并告诉列表查看它包含的项目数。

答案 1 :(得分:3)

AddRange比添加

快得多
MyListView.AddRange(items)

答案 2 :(得分:2)

有两件事要解决这个问题:

  1. 操作列表内容时关闭排序。
  2. 隐藏列表,使其不会尝试绘画。
  3. 第一点是这两者中列表处理的最大性能提升。要实现这一点,只需在修改期间将ListViewItemSorter设置为null,并在结束时将其设置回来。

    对于第二个选项,我经常将列表绘制到位图,然后在PictureBox中显示该位图,以便用户看不到列表消失,然后在我完成时重新显示列表。

答案 3 :(得分:0)

另请注意,您可以隐藏项目,因此在不删除它们的情况下使它们不可见。因此,第一次添加所有项目,然后稍后您只需隐藏不再需要的项目并显示那些项目。