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
,则会选择该项目。
答案 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