1

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

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

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

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

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

4

4 回答 4

4

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

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

于 2008-10-04T01:55:00.653 回答
3

AddRange 比 add 快得多

MyListView.AddRange(items)
于 2008-10-04T02:46:13.610 回答
2

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

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

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

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

于 2008-10-04T01:54:10.017 回答
0

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

于 2008-10-04T02:02:26.770 回答