如何在ObjectListView中过滤多个SubItems

APr*_*ugh 1 .net c# vb.net winforms objectlistview

所以,我试图以编程方式将ModelFilter添加到我的ObjectListView中,它将分别查看两个(或更多)列和过滤器.目前,我认为ObjectListView只支持一个过滤器,但我可能在代码/文档中遗漏了一些东西.

例如,我的一个预期过滤器是查看"活动"列,其值为"A"或"T".另一栏是主管姓名.所以,我想找到Supervisor name ="Smith"和Active ="A"的所有条目.

我可以使用TextMatchFilter单独使用过滤器来处理这些选项中的任何一个,但无法弄清楚如何同时使两者同时工作.

我看到的一个小问题是,如果超级用户名包含"A",那么使用标准过滤器将返回整行.我已经能够通过以编程方式将列的Searchable属性设置为false来解决这个问题,如果我不想查看它们,然后在列表被过滤后再将它们重新打开.但是,我有一种感觉,如果我将Searchable打开为Supervisor列,我将得到不需要的结果.

有没有人知道如何让过滤器在多个列上工作,只使用每个过滤器的指示列?

(我没有示例代码来帮助解决这个问题.但是,如果你真的想看看我对我的过滤代码有什么,我会很乐意添加它;但它在VB中却是如此).

当前代码 - 查看用户选择的值(searchMeth)并启用对该列的搜索.然后它搜索txtSearch框中输入的内容.但是,除此之外,我还想为Supervisor添加一个额外的过滤器.(参见AndAlso评论

    olvEmps.UseFiltering = True
    OlvColumn1.Searchable = False
    OlvColumn2.Searchable = False
    OlvColumn4.Searchable = False
    OlvColumn3.Searchable = False
    OlvColumn5.Searchable = False

    Select Case searchMeth
        Case "Name"
            OlvColumn1.Searchable = True
        Case "Employee Number"
            OlvColumn2.Searchable = True
        Case "Department"
            OlvColumn3.Searchable = True
    End Select

    olvEmps.OwnerDraw = True
    Dim tFilter As BrightIdeasSoftware.TextMatchFilter = BrightIdeasSoftware.TextMatchFilter.Contains(olvEmps, txtSearch.Text)
    'andalso olvColumn5 = supeName?

    olvEmps.ModelFilter = tFilter
    olvEmps.DefaultRenderer = New BrightIdeasSoftware.HighlightTextRenderer(tFilter)

    OlvColumn1.Searchable = True
    OlvColumn2.Searchable = True
    OlvColumn3.Searchable = True
    OlvColumn4.Searchable = True
    OlvColumn5.Searchable = True
Run Code Online (Sandbox Code Playgroud)

Gra*_*ian 7

我确信PredicateBuilder解决方案可行,但ObjectListView已经提供了一个更简单的解决方案.

TextMatchFilter可以限制它通过Columns属性搜索的列.将其设置为您要考虑的列数组.

TextMatchFilter filter1 = TextMatchFilter.Contains(olvEmps, txtSearch.Text)
filter1.Columns = new [] { this.olvColumn1, this.olvColumn2 };
Run Code Online (Sandbox Code Playgroud)

您可以使用CompositeAllFilter两个或多个其他过滤器组合两个过滤器.

this.olvEmps.ModelFilter = new CompositeAllFilter(new List<IModelFilter> { filter1, filter2 }); 
Run Code Online (Sandbox Code Playgroud)