C# 具有2种颜色但不通过用户的颜色树节点

C# 具有2种颜色但不通过用户的颜色树节点,c#,treeview,treenode,C#,Treeview,Treenode,我想在部分树节点上着色,但不是通过用户(不使用“选定节点”) 所以DrawMode帮不了我 我用的是c# 例如,我希望文本上有空格的所有树节点的一侧为绿色,另一侧为红色 谢谢 DrawMode是一个不错的选择。您必须将其设置为OwnerDrawText,并订阅DrawNode事件。即: this.treeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawText; this.treeView1.DrawNode +=

我想在部分树节点上着色,但不是通过用户(不使用“选定节点”) 所以DrawMode帮不了我

我用的是c#

例如,我希望文本上有空格的所有树节点的一侧为绿色,另一侧为红色


谢谢

DrawMode是一个不错的选择。您必须将其设置为OwnerDrawText,并订阅DrawNode事件。即:

this.treeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawText;
this.treeView1.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView1_DrawNode);
这只是绘图方法的一个示例。为了得到一个好的图形结果,您可以修改它,但它可以给您一个方向的想法

    private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        Font nodeFont = e.Node.NodeFont;
        if (nodeFont == null) nodeFont = ((TreeView)sender).Font;

        string txt = e.Node.Text;
        int idx = txt.IndexOf(' ');
        string greenTxt;
        string redTxt;
        if (idx >= 0)
        {
            greenTxt = txt.Substring(0, idx);
            redTxt = txt.Substring(idx);
        }
        else
        {
            greenTxt = txt;
            redTxt = string.Empty;
        }
        Rectangle greenRect = new Rectangle(e.Bounds.Location, new Size((int)Math.Ceiling(e.Graphics.MeasureString(greenTxt, nodeFont).Width), e.Bounds.Height));
        Rectangle redRect = new Rectangle(e.Bounds.Location + new Size(greenRect.Width, 0), new Size((int)Math.Ceiling(e.Graphics.MeasureString(redTxt, nodeFont).Width), e.Bounds.Height));
        e.Graphics.DrawString(greenTxt, nodeFont, Brushes.Green, greenRect);
        if (!string.IsNullOrEmpty(redTxt))
            e.Graphics.DrawString(redTxt, nodeFont,
                Brushes.Red, redRect);
    }

你可以找到一个更复杂的例子。

我对你的代码有一个问题,当我展开树时,我在树的顶部注册了我,所有我展开的树都在树上,然后我滚动它消失了。你说什么?对不起,我不明白你的意思。也许您可以尝试添加一个图片当我展开节点时,它的子节点出现在树的顶部,位于现有文本的上方。它看起来像两个单词,一个在另一个上面。您正在指定要在何处绘制字符串(字符串所包含的矩形)。我不知道这里发生了什么,但我想看看e.Bounds.Location的值