我想根据 ListView (WinForms) 中的文本过滤器隐藏一些项目。
基本上,列表视图从文本文件加载项目,我不希望在用户搜索列表时读取和/或写入它。搜索是在组合框的 KeyDown 事件中完成的,但 ListViewItem 没有“可见”属性。
有没有简单的方法可以做到这一点,而无需重新读取文件?(因为它是一个 XML 文件,它甚至可能包含数千个项目,因此很难有效地搜索,甚至让用户使用应用程序,因为搜索需要几分钟(主要是加载))。
我想根据 ListView (WinForms) 中的文本过滤器隐藏一些项目。
基本上,列表视图从文本文件加载项目,我不希望在用户搜索列表时读取和/或写入它。搜索是在组合框的 KeyDown 事件中完成的,但 ListViewItem 没有“可见”属性。
有没有简单的方法可以做到这一点,而无需重新读取文件?(因为它是一个 XML 文件,它甚至可能包含数千个项目,因此很难有效地搜索,甚至让用户使用应用程序,因为搜索需要几分钟(主要是加载))。
由于每次添加/删除操作都会重绘列表框,您可能会遇到延迟。尝试像这样将您的添加/删除操作包装在 Begin/End Update 方法中。
myListView.BeginUpdate();
//Add or Remove Items
myListView.EndUpdate();
现在感受一下速度。
当然,您只需加载一次文件。
通过创建一个单独的类来存储数据并在加载文件后对其进行搜索来解决。
尽管对文件进行更改仍然是一个问题,但那是另一回事了……
这不是最好的答案,但有点像我找到的最好的解决方案。您可以自己实现ListView.DrawItem事件来执行以下操作:
void listView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
if (Should_Filter(e.Item) == false)
e.DrawDefault = true;
else
e.DrawDefault = false;
}
然后重新排序所有项目,使过滤的项目位于 ListView 的末尾。这会有点隐藏它们,但是 ListView 在计算它的大小时仍然会计算它们,所以你也应该强制调整 ListView 客户端大小。