2010-05-19 76 views
1

我想基于ListView(WinForms)中的文本过滤器隐藏一些项目。
基本上,listview从文本文件加载项目,我不希望它在用户搜索列表时被读取和/或写入。搜索是在组合框的KeyDown事件中完成的,但ListViewItem没有“Visible”属性。基于过滤器隐藏ListViewItem

有没有简单的方法可以做到这一点,而不需要重新读取文件? (因为它是一个XML文件,甚至可能包含数千个项目,所以很难高效搜索,甚至让用户使用该应用程序,因为搜索需要几分钟的时间(主要是加载))。

+0

你能告诉我们更多关于环境的信息吗?的WinForms? WPF? – 2010-05-19 15:30:26

+0

当然WinForms,我没有太多WPF。我知道,我必须学习,但只有当我真的需要的时候才会这样。 – fonix232 2010-05-19 15:31:26

+0

现在您可能不得不使用虚拟化。 – Amsakanna 2010-05-19 15:50:15

回答

1

我不清楚你想要做什么。我还是会喊出来的一些想法,或许真的是有帮助...

  • 缓存中的文件在内存中
  • 缓存读取项目,并填写输入框上飞
  • 添加和删除物品相应
  • 看看this question
  • 也许它是impossible毕竟呢?

对不起,如果我误会了你。 :(

+0

我想随时修改Visible属性...或者我想,因为它不存在...至少对我来说! – fonix232 2010-05-19 15:32:44

+0

基本的解决办法是添加和删除项目,我猜。 – mafu 2010-05-19 15:36:06

+0

是的,我知道它会是,但正如我指出的那样,制作一个简单的数据库并不会那么容易,因为我们正在谈论成千上万的项目......我想我会继续使用可见性搜索个性化的ListViewItem类属性...或者我应该更改为DataGridView?它甚至支持自动复选框吗? – fonix232 2010-05-19 15:42:49

2

您可能会遇到延迟,由于列表框的重绘每添加/删除操作。尝试包装你的添加/删除OP的内侧开始/像这样结束Update方法。

myListView.BeginUpdate(); 
//Add or Remove Items 
myListView.EndUpdate(); 

现在感觉速度。

Ofcourse,你必须加载的文件只有一次。

0

与创建用于存储数据的一个单独的类,并加载该文件后搜索它解决。

虽然写入文件的修改仍然是一个问题,但这是另一个故事...

0

这不是最好的答案,但有点我找到的最佳解决方案。您可以自己实现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客户端的大小。