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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 14:04:40  来源:igfitidea点击:

Find exact text inside Listview subitems?

.netvb.netlistview

提问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: enter image description here

例子: 在此处输入图片说明

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