#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