【问题标题】:Change treeview sub node colour text colour and image更改树视图子节点颜色文本颜色和图像
【发布时间】:2014-04-26 22:33:20
【问题描述】:

我正在使用下面搜索名为“存档”的节点,然后将其颜色更改为红色和图像索引。

Dim d As String = "Archive"
            For i = 0 To tvProgress.Nodes.Count - 1
                If tvProgress.Nodes(i).Text = d Then
                    tvProgress.Nodes(i).ForeColor = Color.Red
                    tvProgress.Nodes(i).ImageIndex = 1
                End If
            Next

如下图所示,“存档”节点下方有一些结构。我还想更改这些的颜色和图像索引。这些不是像“存档”这样的静态节点名称,所以我不能简单地重复这个过程。

树视图中还有其他节点需要保留为默认的蓝色文件夹,黑色文本

这可能吗?

【问题讨论】:

    标签: vb.net treeview


    【解决方案1】:

    您应该可以使用此代码,只需将d 设置为您要搜索的节点,并将p 设置为您要保留的任何内容。

    'This stores every node in the TreeView
    Dim allNodes As New List(Of TreeNode)
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'the node you want to search for
        Dim d As String = "Archive"
        'the node you want to preserve
        Dim p As String = "Preserve"
        CallRecursive(TreeView1)
        For Each n As TreeNode In allNodes
            If n.Text = d Then
                n.ForeColor = Color.Red
                n.ImageIndex = 1
            ElseIf Not n.Text = p Then
                Dim path As String = n.FullPath
                Dim l As List(Of String) = path.Split("\").ToList()
                If l.Contains(d) Then
                    If l.IndexOf(n.Text) > l.IndexOf(d) Then
                        n.ForeColor = Color.Red
                        n.ImageIndex = 1
                    End If
                End If
            End If
        Next
    End Sub
    
    Private Sub GetRecursive(ByVal n As TreeNode)
        allNodes.Add(n)
        Dim aNode As TreeNode
        For Each aNode In n.Nodes
            GetRecursive(aNode)
        Next
    End Sub
    
    Private Sub CallRecursive(ByVal aTreeView As Windows.Forms.TreeView)
        allNodes.Clear()
        Dim n As TreeNode
        For Each n In aTreeView.Nodes
            GetRecursive(n)
        Next
    End Sub
    

    用于获取TreeView 中每个节点的过程称为递归 过程,这基本上意味着GetRecursive() 将调用自身,直到它通过您的TreeView 中的每个节点。多亏了这一点,这段代码将通过任何TreeView,无论深度如何。

    这是我用来测试这段代码的TreeView之前代码运行:



    之后代码运行:



    我希望这会有所帮助,有任何问题,我会尽力提供帮助。


    编辑:

    如果您只想格式化“存档”下的所有节点,请使用此稍作修改的代码:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'the node you want to search for
        Dim d As String = "Archive"
        CallRecursive(TreeView1)
        For Each n As TreeNode In allNodes
            If n.Text = d Then
                n.ForeColor = Color.Red
                n.ImageIndex = 1
            Else
                Dim path As String = n.FullPath
                Dim l As List(Of String) = path.Split("\").ToList()
                If l.Contains(d) Then
                    If l.IndexOf(n.Text) > l.IndexOf(d) Then
                        n.ForeColor = Color.Red
                        n.ImageIndex = 1
                    End If
                End If
            End If
        Next
    End Sub
    
    Private Sub GetRecursive(ByVal n As TreeNode)
        allNodes.Add(n)
        Dim aNode As TreeNode
        For Each aNode In n.Nodes
            GetRecursive(aNode)
        Next
    End Sub
    
    Private Sub CallRecursive(ByVal aTreeView As Windows.Forms.TreeView)
        allNodes.Clear()
        Dim n As TreeNode
        For Each n In aTreeView.Nodes
            GetRecursive(n)
        Next
    End Sub
    

    【讨论】:

    • 哇,非常感谢,但我不确定它是否适合我。基本上,“存档”节点下的节点是由用户添加的,不会是同名的。我想我想说的是,“存档”节点下的任何节点都应该被格式化为红色。
    • 然后简单地删除ElseIf Not n.Text = p Then和匹配的End If,但是没有里面的任何东西,我会更新我的答案。
    猜你喜欢
    • 2016-07-06
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2021-08-22
    • 2016-09-17
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多