设置TreeNode的背景颜色

时间:2017-05-16 15:43:43

标签: c# winforms treeview

我有一个像这样的TreeView:

System.Windows.Forms.TreeView treeView;
this.treeView = new System.Windows.Forms.TreeView();

treeView.Update();
treeNode = this.treeView.Nodes.Add(yadda1);
treeNode = this.treeView.Nodes.Add(yadda2);
treeNode = this.treeView.Nodes.Add(yadda3);

foreach (TreeNode node in treeView.Nodes)
{
    namedNode = getTreeNodeFromName(documentType, node);
    if (namedNode != null)
    {
        break; // found it
    }
}
treeView.SelectedNode = namedNode;
treeView.SelectedNode.BackColor = Color.Blue;
treeView.Focus();
this.treeView.EndUpdate();

此代码几乎可以使用。默认情况下,所选节点由背景颜色指示为非常浅灰色,难以看清。所以我以编程方式将其设置为蓝色,但在用户点击另一个节点之前,背景不会变为蓝色。

上一个问题建议调用treeView.Focus(),但这没有任何区别。

如何让背景颜色立即转到蓝色?

1 个答案:

答案 0 :(得分:1)

这是另一种方法。直接从TreeView类继承。这只是获取绘制节点文本部分的基础知识。我还在制作'线路。部分但是必须等到我回家。但是,这将使您开始并显示另一种方法来做您想要的。从控件派生来创建自己的类是非常强大的,并且允许最大的灵活性,但也需要最大的努力。即便如此,它也不是纪念性的。

public class CustomTreeView : TreeView
{
    public CustomTreeView() : base()
    {
        this.SetStyle(
            ControlStyles.UserPaint |
            ControlStyles.DoubleBuffer |
            ControlStyles.Opaque, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        using (System.Drawing.SolidBrush BackGroundBrush = new System.Drawing.SolidBrush(System.Drawing.SystemColors.Window))
        using (System.Drawing.SolidBrush ForeGroundBrush = new System.Drawing.SolidBrush(System.Drawing.SystemColors.WindowText))
        using (System.Drawing.SolidBrush BackGroundBrushHighLight = new System.Drawing.SolidBrush(System.Drawing.Color.DarkGreen))
        using (System.Drawing.SolidBrush ForeGroundBrushHighLight = new System.Drawing.SolidBrush(System.Drawing.Color.Pink))
        {
            e.Graphics.FillRectangle(BackGroundBrush, e.ClipRectangle);
            System.Drawing.SolidBrush CurrentNode;

            int count = this.Nodes.Count;
            for (int index = 0; index < count; ++index)
            {
                if (Nodes[index].IsSelected)
                {
                    CurrentNode = ForeGroundBrushHighLight;
                    e.Graphics.FillRectangle(BackGroundBrushHighLight, Nodes[index].Bounds);
                }
                else
                {
                    CurrentNode = ForeGroundBrush;
                }
                e.Graphics.DrawString(Nodes[index].Text, this.Font, CurrentNode, Rectangle.Inflate(Nodes[index].Bounds, 2, 0));
            }

        }
    }
}