winforms 如何在所有TreeView节点中动态搜索字符串,展开和折叠与搜索字符串匹配(或不匹配)的节点?

kx7yvsdv  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(142)

我正在尝试在一个treeview组件上实现动态搜索,而且我几乎已经完成了,除了因为它是基于文本框的textchanged事件的动态搜索,所以搜索字符串的第一个字符总是被找到,所以搜索函数扩展所有节点,因为它们是有效的匹配。
问题是,随着搜索字符串变得更加完整,那些在匹配时展开的节点现在需要折叠,因为它们不再匹配搜索字符串......而这并没有发生......我还没有找到一种方法来随着搜索字符串的变化动态地折叠和展开节点......
我已经上传了一个视频和Visual Studio 2012解决方案,所以你可以看看它,看看我在哪里掉球...
下面是执行搜索的函数的代码:(您可以在视频中看到它按预期工作,所以我的问题是节点的展开/折叠,因为它们匹配(或不匹配)搜索字符串。
我已经在“FindRecursive”函数中实现了一些想法来折叠和展开节点,但它并没有像预期的那样工作。由于我的错误逻辑,我甚至设法将控件置于无限循环中。
Video showing the problem
Visual Studio 2012 Project + Test File

Private Sub txtFiltroIDs_TextChanged(sender As Object, e As EventArgs) Handles txtFilterToolIDs.TextChanged
        ClearBackColor()
        FindByText()
    End Sub

    Private Sub FindByText()
        Dim nodes As TreeNodeCollection = tviewToolIDs.Nodes
        Dim n As TreeNode
        For Each n In nodes
            FindRecursive(n)
        Next
    End Sub

    Private Sub FindRecursive(ByVal tNode As TreeNode)
        If txtFilterToolIDs.Text = "" Then
            tviewToolIDs.CollapseAll()
            tviewToolIDs.BackColor = Color.White
            ExpandToLevel(tviewToolIDs.Nodes, 1)
        Else
            Dim tn As TreeNode
            For Each tn In tNode.Nodes
                ' if the text properties match, color the item
                If tn.Text.Contains(txtFilterToolIDs.Text) Then
                    tn.BackColor = Color.Yellow
                    tn.EnsureVisible()        'Scroll the control to the item
                End If

                FindRecursive(tn)
            Next
        End If
    End Sub

    Private Sub ClearBackColor()
        Dim nodes As TreeNodeCollection
        nodes = tviewToolIDs.Nodes
        Dim n As TreeNode
        For Each n In nodes
            ClearRecursive(n)
        Next
    End Sub

    Private Sub ClearRecursive(ByVal treeNode As TreeNode)
        Dim tn As TreeNode
        For Each tn In treeNode.Nodes
            tn.BackColor = Color.White
            ClearRecursive(tn)
        Next
    End Sub
wztqucjr

wztqucjr1#

按照我最初的评论,尝试类似这样的内容:

Private Sub txtFiltroIDs_TextChanged(sender As Object, e As EventArgs) Handles txtFilterToolIDs.TextChanged
    tviewToolIDs.BeginUpdate()
    tviewToolIDs.CollapseAll()
    ClearBackColor()
    FindByText()
    tviewToolIDs.EndUpdate()
    tviewToolIDs.Refresh()
End Sub

相关问题