Выполнить поиск ListView FindItemWithText в любом месте текста

#vb.net #visual-studio-2010 #search

#vb.net #visual-studio-2010 #Поиск

Вопрос:

 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 элемент будет выбран.

Комментарии:

1.что значит «если бы я захотел выполнить поиск Card и найти W_Card_Brt_Better «, является ли card поисковым термином? использование вами разметки кода приводит к путанице. В обозревателе объектов находит первый элемент ListViewItem … это начинается с указанного текстового значения. Если вы хотите выполнить поиск по Contains типу, вам придется выполнять итерации, LV просто выполняет StartsWith

2. Допустим, вы ищете слово «Card», но перед ним стоит какой-то префикс. Я хочу, чтобы он в любом случае показывал результат. В этом сценарии он выполняет поиск с самого начала. Нигде в тексте. Я не уверен, как это описать :/

Ответ №1:

ListView.FindItemWithText всегда выполняет поиск с использованием шаблона BeginsWith — это сделано специально, как указано в документах:

Находит первый элемент ListViewItem, который начинается с указанного текстового значения.

Если вы пытаетесь сделать что-то более пользовательское, чем это, я предлагаю вам вместо этого выполнить поиск по базовому источнику данных. Как правило, вам следует избегать выполнения какой-либо бизнес-логики / проверки непосредственно из элемента управления пользовательского интерфейса.

В бизнес-объекте вы можете выполнить простой цикл for или создать словарь, чтобы ускорить поиск, и инкапсулировать эту функцию поиска в метод или свойство, которые вы будете вызывать из уровня пользовательского интерфейса.

Ответ №2:

FindItemWithText находит первый элемент ListViewItem … это начинается с указанного текстового значения. Если вы ищете элементы / подпункты, которые просто содержат текст, вам придется выполнять итерации и поиск самостоятельно.

Чтобы сделать его похожим на FindItemWithText, укажите начальную точку и 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