使ListView FindItemWithText在文本中的任何位置进行搜索

时间:2014-07-06 21:08:22

标签: vb.net visual-studio-2010 search

Dim query as String = "Card" ' Just an example, I would call this with a function
Dim itemF As ListViewItem = ListView1.FindItemWithText(query, False, 0, True)
If (itemF IsNot Nothing) Then
    itemF.Selected = True
Else
    Alert("Nothing was found")
End If

所以我尝试使用此代码添加搜索功能。问题是,如果我试图从开始到结束,这是有效的。但如果我想搜索Card并找到W_Card_Brt_Better,我就无法获得预期结果。但是,如果我搜索W_Card,则会选择该项目。

2 个答案:

答案 0 :(得分:0)

ListView.FindItemWithText总是使用BeginsWith模式进行搜索 - 这是设计的,如文档中所指定的那样:

  

查找以指定文本值开头的第一个ListViewItem。

如果您尝试执行比此更自定义的任何操作,我建议您搜索基础数据源。您通常应该避免直接从UI控件执行任何类型的业务逻辑/验证。

在业务对象中,您可以执行简单的for循环或构建字典,以使其搜索更快,并将此搜索功能封装在您将从UI层调用的方法或属性中。

答案 1 :(得分:0)

FindItemWithText使用指定的文本值找到第一个ListViewItem ... 开始。如果您正在寻找只包含文本的Items / SubItems,您必须迭代并搜索自己。

要使其像FindItemWithText一样,为SubItem搜索指定一个起点和Bool:

Function FindItemContainingText(lv As ListView, searchSubs As Boolean,
               StartIndex As Integer,
               searchTarget As String) As ListViewItem

    If (StartIndex >= lv.Items.Count) Or (StartIndex < 0) Then
        Return Nothing
    End If

    Dim FindMe As String = searchTarget.ToLowerInvariant
    Dim subStopper As Integer = 0

    For i As Integer = StartIndex To lv.Items.Count - 1
        If searchSubs Then
            subStopper = lv.Items(i).SubItems.Count - 1
        Else
            ' Item.Text/Label can be read from SubItem(0)
            ' just look at it if not searching subI's
            subStopper = 0
        End If

        For n As Integer = 0 To subStopper
           If lv.Items(i).SubItems(n).Text.ToLowerInvariant.Contains(FindMe) Then
                ' return the LVI that contains the text
                Return lv.Items(i)
            End If
        Next n

    Next
    ' note!
    Return Nothing
End Function