Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Treeview提升drawnode,但某些更改不会传播到屏幕_.net_Vb.net_Winforms_Graphics_Treeview - Fatal编程技术网

.net Treeview提升drawnode,但某些更改不会传播到屏幕

.net Treeview提升drawnode,但某些更改不会传播到屏幕,.net,vb.net,winforms,graphics,treeview,.net,Vb.net,Winforms,Graphics,Treeview,我正在使用VB中的树视图,以OwnerDrawText作为我的绘图模式。我已经在我的树状视图中处理了Me.DrawNode,以允许我突出显示特定的项目,即突出显示最后一个节点,以此类推。我看到drawnode被调用,并尝试将所有背景设置为自定义颜色 Public Class Form1 Private nodelist As New List(Of TreeNode) Public Sub New() InitializeComponent()

我正在使用VB中的树视图,以OwnerDrawText作为我的绘图模式。我已经在我的树状视图中处理了Me.DrawNode,以允许我突出显示特定的项目,即突出显示最后一个节点,以此类推。我看到drawnode被调用,并尝试将所有背景设置为自定义颜色

Public Class Form1
    Private nodelist As New List(Of TreeNode)

    Public Sub New()
        InitializeComponent()
        TreeView1.Nodes.AddRange(New TreeNode() {
            New TreeNode("Text of Node 0") With {.Name = "Node0"},
            New TreeNode("Text of Node 1") With {.Name = "Node1"},
            New TreeNode("Text of Node 2") With {.Name = "Node2"},
            New TreeNode("Text of Node 3") With {.Name = "Node3"},
            New TreeNode("Text of Node 4") With {.Name = "Node4"}
        })
    End Sub

    Private Sub myTreeView_DrawNode(ByVal sender As Object, ByVal e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
        Console.WriteLine(e.Node.Text & " Rewritten")

        ' Draw the background and node text for a selected node.
        If nodelist.Contains(e.Node) Then
            e.Graphics.FillRectangle(New SolidBrush(Color.Chartreuse), e.Bounds)
            TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Bounds,
                                  Color.Black, Color.Empty,
                                  TextFormatFlags.VerticalCenter)
        Else
            e.Graphics.FillRectangle(New SolidBrush(Color.Black), e.Bounds)
            TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Bounds,
                                  Color.White, Color.Empty,
                                  TextFormatFlags.VerticalCenter)
        End If
    End Sub

    Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView1.MouseDown
        Console.WriteLine("Clicked")
        Dim clickedNode As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)
        nodelist.Add(clickedNode)
        If nodelist.Count > 3 Then
            nodelist.RemoveAt(0)
        End If
        TreeView1.SelectedNode = clickedNode
    End Sub
End Class

此代码应高亮显示最后三个选定节点。但是,如果单击从0到5的所有节点,您将看到它高亮显示所有内容。然后,如果选择节点2,您将看到所有节点都被重新绘制Console.WriteLine显示了这一点,我认为这意味着节点1和2应该失去高亮颜色,但它们没有。绘图部分是正确的,尽管可以简化:相同的方法可用于背景和文本渲染,把代码升级

MouseDown事件中的逻辑需要进行部分重构,因此被选中和未被选中的节点实际上会从节点集合nodelist字段中添加和删除

TreeView还需要通知更改,调用其方法,以便控件可以重新绘制新的节点选择。在本例中,Invalidate会导致控件重新绘制自身,提升其绘制或类似的相关事件:DrawNode事件

Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
    Console.WriteLine(e.Node.Text & " Rewritten")

    Dim backColor As Color = Color.Black
    Dim foreColor As Color = Color.White
    If nodelist.Contains(e.Node) Then
        backColor = Color.Chartreuse
        foreColor = Color.Black
    End If

    e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
    TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
                          foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
简化绘图方法:

► 注意:这里,我使用e.Node.Bounds作为节点背景和文本的边框。e、 如果矩形在实际实现中看起来太紧,则可以使用边界。在这种情况下,要进行测试,可将其视为优先事项

Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
    Console.WriteLine(e.Node.Text & " Rewritten")

    Dim backColor As Color = Color.Black
    Dim foreColor As Color = Color.White
    If nodelist.Contains(e.Node) Then
        backColor = Color.Chartreuse
        foreColor = Color.Black
    End If

    e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
    TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
                          foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
MouseDown事件会将当前选定的节点添加到nodelist集合(如果该节点尚未存在),否则将从集合中删除该节点。 在将所选节点添加到集合之前,验证了另一个条件:集合不能包含超过4个项目;如果集合已满,则不会添加选定的节点

Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView1.MouseDown
    Dim clickedNode As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)
    If nodelist.Contains(clickedNode) Then
        nodelist.Remove(clickedNode)
    Else
        If nodelist.Count < 4 Then
            nodelist.Add(clickedNode)
            TreeView1.SelectedNode = clickedNode
        End If
    End If
    TreeView1.Invalidate()
End Sub

绘图部分是正确的,即使它可以简化:同样的方法可以用于背景和文本渲染,以增加代码

MouseDown事件中的逻辑需要进行部分重构,因此被选中和未被选中的节点实际上会从节点集合nodelist字段中添加和删除

TreeView还需要通知更改,调用其方法,以便控件可以重新绘制新的节点选择。在本例中,Invalidate会导致控件重新绘制自身,提升其绘制或类似的相关事件:DrawNode事件

Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
    Console.WriteLine(e.Node.Text & " Rewritten")

    Dim backColor As Color = Color.Black
    Dim foreColor As Color = Color.White
    If nodelist.Contains(e.Node) Then
        backColor = Color.Chartreuse
        foreColor = Color.Black
    End If

    e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
    TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
                          foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
简化绘图方法:

► 注意:这里,我使用e.Node.Bounds作为节点背景和文本的边框。e、 如果矩形在实际实现中看起来太紧,则可以使用边界。在这种情况下,要进行测试,可将其视为优先事项

Private Sub TreeView1_DrawNode(sender As Object, e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode
    Console.WriteLine(e.Node.Text & " Rewritten")

    Dim backColor As Color = Color.Black
    Dim foreColor As Color = Color.White
    If nodelist.Contains(e.Node) Then
        backColor = Color.Chartreuse
        foreColor = Color.Black
    End If

    e.Graphics.FillRectangle(New SolidBrush(backColor), e.Node.Bounds)
    TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, e.Node.Bounds,
                          foreColor, Color.Transparent, TextFormatFlags.VerticalCenter)
End Sub
MouseDown事件会将当前选定的节点添加到nodelist集合(如果该节点尚未存在),否则将从集合中删除该节点。 在将所选节点添加到集合之前,验证了另一个条件:集合不能包含超过4个项目;如果集合已满,则不会添加选定的节点

Private Sub myTreeView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView1.MouseDown
    Dim clickedNode As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)
    If nodelist.Contains(clickedNode) Then
        nodelist.Remove(clickedNode)
    Else
        If nodelist.Count < 4 Then
            nodelist.Add(clickedNode)
            TreeView1.SelectedNode = clickedNode
        End If
    End If
    TreeView1.Invalidate()
End Sub

我已经用你在PasteBin中发布的代码更新了你的OP。下次,在这里添加你的代码。我已经用你在PasteBin中发布的代码更新了你的OP。下次,在这里添加您的代码。感谢Jimi的回复,因为这将修复它。感谢Jimi的回复,因为这将修复它。