我想基于ListView(WinForms)中的文本过滤器隐藏一些项目。
基本上,listview从文本文件加载项目,我不希望它在用户搜索列表时被读取和/或写入。搜索是在组合框的KeyDown事件中完成的,但ListViewItem没有“Visible”属性。基于过滤器隐藏ListViewItem
有没有简单的方法可以做到这一点,而不需要重新读取文件? (因为它是一个XML文件,甚至可能包含数千个项目,所以很难高效搜索,甚至让用户使用该应用程序,因为搜索需要几分钟的时间(主要是加载))。
我想基于ListView(WinForms)中的文本过滤器隐藏一些项目。
基本上,listview从文本文件加载项目,我不希望它在用户搜索列表时被读取和/或写入。搜索是在组合框的KeyDown事件中完成的,但ListViewItem没有“Visible”属性。基于过滤器隐藏ListViewItem
有没有简单的方法可以做到这一点,而不需要重新读取文件? (因为它是一个XML文件,甚至可能包含数千个项目,所以很难高效搜索,甚至让用户使用该应用程序,因为搜索需要几分钟的时间(主要是加载))。
我不清楚你想要做什么。我还是会喊出来的一些想法,或许真的是有帮助...
对不起,如果我误会了你。 :(
您可能会遇到延迟,由于列表框的重绘每添加/删除操作。尝试包装你的添加/删除OP的内侧开始/像这样结束Update方法。
myListView.BeginUpdate();
//Add or Remove Items
myListView.EndUpdate();
现在感觉速度。
Ofcourse,你必须加载的文件只有一次。
与创建用于存储数据的一个单独的类,并加载该文件后搜索它解决。
虽然写入文件的修改仍然是一个问题,但这是另一个故事...
这不是最好的答案,但有点我找到的最佳解决方案。您可以自己实现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客户端的大小。
你能告诉我们更多关于环境的信息吗?的WinForms? WPF? – 2010-05-19 15:30:26
当然WinForms,我没有太多WPF。我知道,我必须学习,但只有当我真的需要的时候才会这样。 – fonix232 2010-05-19 15:31:26
现在您可能不得不使用虚拟化。 – Amsakanna 2010-05-19 15:50:15