如何有效地过滤大型 LIstViewItemCollection

本文关键字:大型 LIstViewItemCollection 过滤 有效地 | 更新日期: 2023-09-27 17:47:21

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

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

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

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

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

如何有效地过滤大型 LIstViewItemCollection

有更好的方法,您可以使用列表视图的虚拟模式。

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

AddRange 比 add 快得多

MyListView.AddRange(items)

有两件事可以解决这个问题:

  1. 在操作列表内容时关闭排序。
  2. 隐藏列表,使其不会尝试绘制。

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

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

另请注意,您可以隐藏项目,因此无需删除它们即可使其不可见。因此,第一次添加所有项目,然后您只需隐藏不再需要的项目并显示不再需要的项目。