【问题标题】:Filter a Treeview with a Textbox in a VB.NET winforms在 VB.NET winforms 中使用文本框过滤 Treeview
【发布时间】:2018-01-07 01:56:45
【问题描述】:

代码如下;逻辑中看起来有问题,没有显示错误消息。 我正在尝试使用 textbox1.text on change 事件过滤 treeview1 控件。

预期结果是在treeview1 中保留仅与textbox1.text 相似的节点(SQL 中的%text%)

我在 C# 中找到了很多解决方案的结果,但在 VB.NET 中找不到。

Referencing this answer,并将代码转换为 VB.NET,几乎没有什么变化:

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        Try
            Dim FilterText As String = TextBox1.Text
            TreeView1.BeginUpdate()
            If (FilterText IsNot String.Empty) Then
                For Each Node As TreeNode In TreeView1.Nodes
                    If Not Node.Text.Contains(FilterText) Then
                        Node.Remove()
                        TreeView1.Refresh()
                    End If
                Next
            Else
                Exit Sub
            End If
            TreeView1.EndUpdate()
        Catch ex As Exception
        End Try
    End Sub

【问题讨论】:

  • 我认为最好隐藏节点而不是删除它,以防它需要再次显示。
  • 该代码无法编译...(FilterText String.Empty)...
  • 修复了代码错误,谢谢@Codexer,还是一样
  • The expected result is to keep in treeview1 the nodes that only similar to textbox1.text (%text% in SQL) 那么当您逐步进行调试时发生了什么,您会得到什么?
  • Node.Remove() 正在运行,但在TreeView1 中仍然没有显示,而且它忽略了代码中的第一个节点,注意到TreeView 中的所有节点都是父节点。一旦到达最后一个节点,我现在就会得到Object reference not set to an instance of an object

标签: vb.net winforms filter treeview visual-studio-2017


【解决方案1】:

这里是代码我只是为选定的节点着色。您可以根据需要进行更改

Public Class Form1

Dim matchedNodes As List(Of TreeNode) = New List(Of TreeNode)
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged

    matchedNodes.Clear()
    If Not String.IsNullOrEmpty(TextBox1.Text) Then
        TreeView1.BeginUpdate()
        For Each node As TreeNode In TreeView1.Nodes
            FindRecursive(node)
        Next
        TreeView1.EndUpdate()

    End If
    For Each match In matchedNodes
        match.BackColor = Color.Yellow
    Next
    TreeView1.Refresh()
End Sub
Private Sub FindRecursive(treeNode As TreeNode)
    treeNode.BackColor = Color.White
    If treeNode.Text.Contains(TextBox1.Text) Then
        matchedNodes.Add(treeNode)
    End If

    For Each node As TreeNode In treeNode.Nodes
        If node.Text.Contains(TextBox1.Text) Then
            matchedNodes.Add(node)
        End If
        FindRecursive(node)
    Next
End Sub
End Class

【讨论】:

  • 它经过试验和测试。你试过调试这个吗?
  • 它只是为选定的节点着色。你可以实现的删除逻辑
  • 好的,我明白了。我用c#编写并转换为vb。网。很快就会改正
  • 非常感谢您的尝试;但它真的没有回答我的问题,它缺少滚动到和其他一些东西......理论上你可能是正确的代码,但我正在寻找对我和其他读者方便的东西。另外,我设法找到了答案;请阅读我的答案并添加您的输入。真的谢谢。 @Ramankingdom +1 尝试,希望可以投票更多。
【解决方案2】:

经过几篇文章的阅读;将过滤器应用于树视图非常简单。 即使我最初想隐藏不在过滤器中的其他节点,但这段代码很实用并且可以完成这项工作。

 Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        Dim TxtToFilter As String = TextBox1.Text
        Dim NodeItem As TreeNode
        For Each NodeItem In TreeView1.Nodes
            If NodeItem.Text.ToLower.Contains(TxtToFilter.ToLower)  And TxtToFilter IsNot String.Empty Then
                NodeItem.EnsureVisible()
                NodeItem.BackColor = Color.Yellow
            Else
                NodeItem.BackColor = TreeView1.BackColor
            End If
        Next
    End Sub

注意: 当所有节点都是我的应用程序逻辑中的根/父级时,此代码有效。 没有测试子节点。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多