【问题标题】:Find exact text inside Listview subitems?在 Listview 子项中查找确切的文本?
【发布时间】:2013-06-28 17:47:22
【问题描述】:

在我的应用程序中,我想在列表视图中添加一个包含 3 个子项的项目

第一个子项是:该项的索引号

第二个子项目是:项目的描述

最后一个子项是:目录路径

示例:

就在添加新项目之前,我尝试搜索列表视图是否已经包含第三个子项目(目录路径)以及我创建的函数:

' 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

...现在,问题是,例如,如果我首先在列表视图中添加一个项目,该项目包含目录 "C:\electro" 作为第三个子项,如图所示,然后稍后我无法使用 "C:\" 目录添加新项目,因为我的函数没有搜索全文,当我搜索“C”时,我的函数找到“C:\Electro” :\",它会搜索一段文本,我需要其他的。

然后我需要改进在列表视图中搜索全文而不是一段文本的功能。

最后一个例子:

如果我在列表视图中有一个带有字符串“C:\Electro”的项目,并且我在列表视图项目中搜索是否存在“C:\”,则所需的结果是“FALSE”(不存在目录 C:\ , 是 C:\Electro)

更新:

从类中提取的代码示例,如果您想了解我的意思...

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

【问题讨论】:

    标签: .net vb.net listview


    【解决方案1】:

    这是一个简单的小函数,它接受 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
    

    你可以这样称呼它:

    If Not FindItem(ListView_Sendto, 2, TextBox_Sendto_Directory.Text) Then
    

    比较不区分大小写。如果你想要区分大小写,你可以使用 CompareTo 方法而不是相等。

    如有必要,您可以添加错误捕获,以防列索引超出范围。

    【讨论】:

      【解决方案2】:

      这不是一个正确的答案,但你可以尝试一个技巧:

      只需再添加一列(隐藏)
      并写在那个"^" + Directory Path + "^"然后搜索^C:\^,它只会找到C:\而不是C:\Electro

      【讨论】:

        【解决方案3】:

        最后...我做了sn-p:

        #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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-14
          • 2022-08-19
          • 2011-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多