vb.net 在 Listview 子项中找到确切的文本?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17370716/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Find exact text inside Listview subitems?
提问by ElektroStudios
In my application I want to add a item of 3 subitems in a listview
在我的应用程序中,我想在列表视图中添加 3 个子项
first subitem is : the index number of the item
第一个子项是:项的索引号
second subitem is : A description for the item
第二个子项目是:项目的描述
last subitem is : A directory path
最后一个子项是:目录路径
Example:

例子:

Just before adding a new item I try to search if the listview already contains the third subitem (the directory path) with a function I've made:
在添加新项目之前,我尝试使用我创建的函数搜索列表视图是否已经包含第三个子项目(目录路径):
' Find ListView Text
Private Function Find_ListView_Text(ByVal ListView As ListView, ByVal Text As String) As Boolean
Try : Return Convert.ToBoolean(ListView.FindItemWithText(Text)) : Catch : Return True : End Try
End Function
...Now, the problem is for example if I first add in the listview a Item wich contains the directory "C:\electro"as the third subitem like seen in the image, then later I can't add a new item with a "C:\"directory because my function is not searching for a full text, my function founds "C:\Electro" when I search for "C:\", it searchs for a piece of text and I need the otherwise.
...现在,问题是,例如,如果我首先在列表视图中添加一个包含目录“C:\electro”的项目作为图像中看到的第三个子项目,然后我无法添加一个新项目一个“C:\”目录,因为我的函数没有搜索全文,当我搜索“C:\”时,我的函数找到“C:\Electro”,它搜索一段文本,否则我需要。
Then I need to improve the function to search inside a listview for a full text, not for a piece of text.
然后我需要改进在列表视图中搜索全文而不是一段文本的功能。
Last example:
最后一个例子:
If I have an item in the listview with the string "C:\Electro" and I search if exist "C:\" in the listviews items, the desired result is "FALSE" (Not exists the directory C:\, is C:\Electro)
如果我在列表视图中有一个带有字符串“C:\Electro”的项目,并且我在列表视图项目中搜索是否存在“C:\”,则期望的结果是“FALSE”(不存在目录 C:\,是 C :\电)
UPDATE:
更新:
A code example extracted from the class, if you want to see what I mean...
从类中提取的代码示例,如果您想了解我的意思...
Private Sub TextBoxes_Sendto_TextChanged(sender As Object, e As EventArgs) _
Handles TextBox_Sendto_Directory.TextChanged, _
TextBox_Sendto_Description.TextChanged
If TextBox_Sendto_Description.TextLength <> 0 _
AndAlso TextBox_Sendto_Directory.TextLength <> 0 Then
If Not Find_ListView_Text(ListView_Sendto, TextBox_Sendto_Directory.Text) Then
Label_Sendto_Status.Text = "Directory ready to add"
Label_Sendto_Status.ForeColor = Color.YellowGreen
Button_Sendto_Add.Enabled = True
Else
Label_Sendto_Status.Text = "Directory already added"
Label_Sendto_Status.ForeColor = Color.Red
Button_Sendto_Add.Enabled = False
End If
Else
Button_Sendto_Add.Enabled = False
End If
End Sub
Private Sub Button_Sendto_Add_Click(sender As Object, e As EventArgs) Handles Button_Sendto_Add.Click
Dim item = ListView_Sendto.AddItem(ListView_Sendto.Items.Count + 1)
item.SubItems.Add(TextBox_Sendto_Description.Text)
item.SubItems.Add(TextBox_Sendto_Directory.Text)
End Sub
' Find ListView Text
Private Function Find_ListView_Text(ByVal ListView As ListView, ByVal Text As String) As Boolean
Try : Return Convert.ToBoolean(ListView.FindItemWithText(Text)) : Catch : Return True : End Try
End Function
采纳答案by tinstaafl
Here's a simple little function that takes the ListViewItemcollection, the zero-based column index and a search string and returns whether the search string exists in any subitem in that column:
这是一个简单的小函数,它接受 ListViewItemcollection、从零开始的列索引和一个搜索字符串,并返回搜索字符串是否存在于该列的任何子项中:
Private Function FindItem(ItemList As ListView.ListViewItemCollection, ColumnIndex As Integer, SearchString As String) As Boolean
For Each Item As ListViewItem In ItemList
If Item.SubItems(ColumnIndex).Text = SearchString Then
Return True
End If
Next
Return False
End Function
You would call it like this:
你会这样称呼它:
If Not FindItem(ListView_Sendto, 2, TextBox_Sendto_Directory.Text) Then
The comparison is case insensitive. If you want case sensitivity you could use the CompareTo method instead of equality.
比较不区分大小写。如果您想要区分大小写,您可以使用 CompareTo 方法而不是相等。
If necessary you could add error trapping in case the column index is out of range.
如有必要,您可以添加错误捕获,以防列索引超出范围。
回答by Sachin
This is not a proper answer but one trick you can try :
这不是一个正确的答案,而是您可以尝试的一个技巧:
just add one more column(hidden)
and write in that "^" + Directory Path + "^"and then search for ^C:\^, it will only find C:\not C:\Electro
只需添加更多的列(隐藏)
,并写在"^" + Directory Path + "^"再搜索^C:\^,只会找到C:\不C:\Electro
回答by ElektroStudios
Finally... I did the snippet:
最后......我做了这个片段:
#Region " [ListView] Find ListView Text "
' [ListView] Find ListView Text Function
'
' // By Elektro H@cker
'
' Examples :
' MsgBox(Find_ListView_Text(ListView1, "Test"))
' MsgBox(Find_ListView_Text(ListView1, "Test", 2, True, True))
' If Find_ListView_Text(ListView1, "Test") Then...
Private Function Find_ListView_Text(ByVal ListView As ListView, _
ByVal SearchString As String, _
Optional ByVal ColumnIndex As Int32 = Nothing, _
Optional ByVal MatchFullText As Boolean = True, _
Optional ByVal IgnoreCase As Boolean = True) As Boolean
Dim ListViewColumnIndex As Int32 = ListView.Columns.Count - 1
Select Case ColumnIndex
Case Is < 0, Is > ListViewColumnIndex ' ColumnIndex is out of range
Throw New Exception("ColumnIndex is out of range. " & vbNewLine & _
"ColumnIndex Argument: " & ColumnIndex & vbNewLine & _
"ColumnIndex ListView: " & ListViewColumnIndex)
Case Nothing ' ColumnIndex is nothing
If MatchFullText AndAlso IgnoreCase Then ' Match full text, All columns, IgnoreCase
For Each Item As ListViewItem In ListView.Items
For X As Int32 = 0 To ListViewColumnIndex
If Item.SubItems(X).Text.ToLower = SearchString.ToLower Then Return True
Next
Next
ElseIf MatchFullText AndAlso Not IgnoreCase Then ' Match full text, All columns, CaseSensitive
For Each Item As ListViewItem In ListView.Items
For X As Int32 = 0 To ListViewColumnIndex
If Item.SubItems(X).Text = SearchString Then Return True
Next
Next
ElseIf Not MatchFullText AndAlso IgnoreCase Then ' Match part of text, All columns, IgnoreCase
If ListView1.FindItemWithText(SearchString) IsNot Nothing Then _
Return True _
Else Return False
ElseIf Not MatchFullText AndAlso Not IgnoreCase Then ' Match part of text, All columns, CaseSensitive
For Each Item As ListViewItem In ListView.Items
For X As Int32 = 0 To ListViewColumnIndex
If Item.SubItems(X).Text.Contains(SearchString) Then Return True
Next
Next
End If
Case Else ' ColumnIndex is other else
If MatchFullText AndAlso IgnoreCase Then ' Match full text, ColumnIndex, IgnoreCase
For Each Item As ListViewItem In ListView.Items
If Item.SubItems(ColumnIndex).Text.ToLower = SearchString.ToLower Then Return True
Next
ElseIf MatchFullText AndAlso Not IgnoreCase Then ' Match full text, ColumnIndex, CaseSensitive
For Each Item As ListViewItem In ListView.Items
If Item.SubItems(ColumnIndex).Text = SearchString Then Return True
Next
ElseIf Not MatchFullText AndAlso IgnoreCase Then ' Match part of text, ColumnIndex, IgnoreCase
For Each Item As ListViewItem In ListView.Items
If Item.SubItems(ColumnIndex).Text.ToLower.Contains(SearchString.ToLower) Then Return True
Next
ElseIf Not MatchFullText AndAlso Not IgnoreCase Then ' Match part of text, ColumnIndex, CaseSensitive
For Each Item As ListViewItem In ListView.Items
If Item.SubItems(ColumnIndex).Text.Contains(SearchString) Then Return True
Next
End If
End Select
Return False
End Function
#End Region

