基于过滤器隐藏ListViewItem

时间:2010-05-19 15:27:57

标签: c# search listview listviewitem

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

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

4 个答案:

答案 0 :(得分:2)

由于每次添加/删除操作都会重新绘制列表框,因此可能会遇到延迟。尝试在这样的开始/结束更新方法中包装你的添加/删除操作。

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

现在感受速度。

当然,您只需加载一次文件。

答案 1 :(得分:1)

我不清楚你要做什么。我仍然会大声说出一些想法,也许有些有用......

  • 将文件缓存在内存中
  • 缓存已读取的项目并即时填写输入框
  • 相应地添加和删除项目
  • 查看this question
  • 毕竟可能是impossible

抱歉,如果我弄错了。 :(

答案 2 :(得分:0)

解决了创建一个单独的类来存储数据,并在加载文件后进行搜索。

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

答案 3 :(得分: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客户端大小。