узел дерева цветов с 2 цветами, но не через пользователя

Я хочу раскрасить часть узла дерева, но не через пользователя (без использования «выбранного узла»), поэтому DrawMode мне не помогает.

я использую С#

Например, я хочу, чтобы все узлы дерева с пробелом в тексте были окрашены с одной стороны в зеленый, а с другой стороны в красный.

Спасибо!!


person tzvia a    schedule 11.02.2013    source источник


Ответы (1)


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);
    }

Вы можете найти более сложный пример здесь.

person Francesco Baruchelli    schedule 11.02.2013
comment
У меня проблема с вашим кодом, когда я расширяю дерево зачисленных мной в верх дерева, все, что я расширяю одно на другое, а затем я накатываю, оно исчезает, что вы скажете? - person tzvia a; 11.02.2013
comment
Извините, но я не понимаю, что вы имеете в виду. Может быть, вы могли бы попробовать добавить изображение - person Francesco Baruchelli; 11.02.2013
comment
Когда я расширяю узел, его дочерний узел появляется в верхней части дерева над текстом, который существует. это похоже на 2 слова одно над другим. - person tzvia a; 12.02.2013
comment
Вы указываете, где именно рисовать строки (прямоугольник, в котором содержится строка). Я не знаю, что здесь происходит, но я бы посмотрел на значения e.Bounds.Location. - person Francesco Baruchelli; 12.02.2013