C# 基于筛选器隐藏ListViewItem
我想根据ListView(WinForms)中的文本过滤器隐藏一些项目。C# 基于筛选器隐藏ListViewItem,c#,search,listview,listviewitem,C#,Search,Listview,Listviewitem,我想根据ListView(WinForms)中的文本过滤器隐藏一些项目。 基本上,listview从文本文件加载项目,我不希望在用户搜索列表时读取和/或写入这些项目。搜索在组合框的KeyDown事件中完成,但ListViewItem没有“可见”属性 有没有简单的方法可以做到这一点,而无需重新读取文件? (由于它是一个XML文件,甚至可能包含数千个项目,因此很难高效搜索,甚至无法让用户使用该应用程序,因为搜索需要几分钟时间(主要是加载))。我不清楚您想做什么。我仍然会大声说出一些想法,也许有些东西
基本上,listview从文本文件加载项目,我不希望在用户搜索列表时读取和/或写入这些项目。搜索在组合框的KeyDown事件中完成,但ListViewItem没有“可见”属性 有没有简单的方法可以做到这一点,而无需重新读取文件?
(由于它是一个XML文件,甚至可能包含数千个项目,因此很难高效搜索,甚至无法让用户使用该应用程序,因为搜索需要几分钟时间(主要是加载))。我不清楚您想做什么。我仍然会大声说出一些想法,也许有些东西是有用的
- 将文件缓存在内存中
- 缓存读取的项目并动态填充输入框
- 相应地添加和删除项目
- 看看
- 也许是吧
对不起,如果我误解了你(由于每次添加/删除操作都会重新绘制列表框,您可能会遇到延迟。请尝试将添加/删除操作包装在开始/结束更新方法中,如下所示
myListView.BeginUpdate();
//Add or Remove Items
myListView.EndUpdate();
现在感受一下速度
当然,您只需加载一次文件。解决方法是创建一个单独的类来存储数据,并在加载文件后进行搜索
虽然对文件进行更改仍然是一个问题,但这是另一个问题…这不是最好的答案,但也是我找到的最好的解决方案。您可以自己实现事件来执行以下操作:
void listView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
if (Should_Filter(e.Item) == false)
e.DrawDefault = true;
else
e.DrawDefault = false;
}
然后对所有项目重新排序,使筛选后的项目位于ListView的末尾。这会有点隐藏它们,但ListView在计算其大小时仍会计算它们,因此您也应该强制调整ListView clientsize的大小。您能告诉我们更多关于环境的信息吗?WinForms?WPF?当然WinForms,我对WPF不太感兴趣。我知道,我知道我必须学习它,但我只有在我真的必须学习的时候才会学习。现在你可能必须,利用虚拟化。我想动态修改可见属性…或者我想,因为它不存在…至少对我来说!基本解决方案是添加和删除项目,我想。是的,我知道会,但正如我指出的,制作一个simple数据库不会那么容易,因为我们正在谈论成千上万的项目…我想我会继续在谷歌上搜索带有Visible属性的个性化ListViewItem类…或者我应该改为DataGridView吗?它甚至支持自动复选框吗?我不明白为什么不能将项目存储在列表中?添加并删除将ListView中的项目保存到此备份列表中/从此备份列表中删除。无需多次解析源文件。是的,也许这是一个好主意…但仍需要更多内存。Visible属性将使其更容易:D