2016-02-02 8 views
3

У меня есть treeview с некоторыми узлами. В некоторых условиях я хочу покрасить каждый узел с другим цветом вместе со своими детьми. Я написал функцию, которая устанавливает узел цвета и его дочерние элементы.Цвет узла дерева с разным цветом

Кто-нибудь, пожалуйста, сообщите мне, есть ли у меня Color.Green как переменная такая, что я не буду писать всю функцию для каждого цвета? Я имею в виду как входной параметр в функции.

Вот функция:

public void ColorChild(TreeNode nodes, int indx) 
{ 
    foreach (TreeNode node_tmp in nodes.Nodes[indx].Nodes) 
    { 
     System.Drawing.Color = Green; 
     node_tmp.ForeColor = color; 
     foreach (TreeNode node_tmp2 in node_tmp.Nodes) 
     { 
      node_tmp2.ForeColor = Color.Green; 
      foreach (TreeNode node_tmp3 in node_tmp2.Nodes) 
      { 
      node_tmp3.ForeColor = Color.Green; 
      foreach (TreeNode node_tmp4 in node_tmp3.Nodes) 
      { 
       node_tmp4.ForeColor = Color.Green; 
       foreach (TreeNode node_tmp5 in node_tmp4.Nodes) 
       { 
        node_tmp5.ForeColor = Color.Green; 
       } 
      } 
      } 
     } 
    } 
} 

ответ

4

Вы можете использовать рекурсию для перебора всех узлов.

Что-то вроде:

void ColorNode(TreeNodeCollection nodes, System.Drawing.Color Color) 
{ 

    foreach (TreeNode child in nodes) 
    { 
     child.ForeColor= Color; 
     if(child.Nodes != null && child.Nodes.Count>0) 
      ColorNode(child.Nodes, Color); 
    } 
} 

И называют это от вас метод, как:

public void ColorChild(TreeNode nodes, int indx) 
{ 
    ColorNode(nodes.Nodes, Color.Green); 
} 
+0

См. Обновленный ответ. Вам нужно изменить «var» в foreach с помощью элемента «TreeNode» – Zippy

0

Ну, если вы хотите цвет в качестве параметра вашей функции, то ничто не мешает вам.

public void ColorChild(TreeNode nodes, int indx, Color color) 
{ 
    foreach (TreeNode node_tmp in nodes.Nodes[indx].Nodes) 
    { 
     node_tmp.ForeColor = color; 
     foreach (TreeNode node_tmp2 in node_tmp.Nodes) 
     { 
      node_tmp2.ForeColor = color; 
      foreach (TreeNode node_tmp3 in node_tmp2.Nodes) 
      { 
      node_tmp3.ForeColor = color; 
      foreach (TreeNode node_tmp4 in node_tmp3.Nodes) 
      { 
       node_tmp4.ForeColor = color; 
       foreach (TreeNode node_tmp5 in node_tmp4.Nodes) 
       { 
        node_tmp5.ForeColor = color; 
       } 
      } 
      } 
     } 
    } 
} 

Тогда просто назвать это как

ColorChild(nodes, indx, Color.Green); 
1

Ваше решение является крайним медленным, если дерево большое. Просто окрашивайте узлы по требованию, когда вы их рисуете. Для этого вам необходимо установить режим рисования:

treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText; 

И затем, когда узел собирается нарисованный, задать свой цвет по требованию:

private void tree_DrawNode(object sender, DrawTreeNodeEventArgs e) 
{ 
    TreeNodeStates state = e.State; 
    Font font = e.Node.NodeFont ?? e.Node.TreeView.Font; 
    Color foreColor; 
    Color backColor; 

    // node is selected 
    // if you want to see the color of a selected node, too, 
    // you can use inverted fore/back colors instead of system selection colors 
    if ((state & TreeNodeStates.Selected) == TreeNodeStates.Selected) 
    { 
     bool isFocused = (state & TreeNodeStates.Focused) == TreeNodeStates.Focused; 
     backColor = SystemColors.Highlight; 
     foreColor = isFocused ? SystemColors.HighlightText : SystemColors.InactiveCaptionText; 
     e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds); 
     if (isFocused) 
      ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, foreColor, backColor); 
     TextRenderer.DrawText(e.Graphics, e.Node.Text, font, e.Bounds, foreColor, TextFormatFlags.GlyphOverhangPadding | TextFormatFlags.SingleLine | TextFormatFlags.EndEllipsis | TextFormatFlags.NoPrefix); 
    } 
    // node is not selected 
    else 
    { 
     backColor = GetBackColor(e.Node); // GetBackColor: return some color by condition 
     foreColor = GetForeColor(e.Node); // GetForeColor: return some color by condition 
     using (Brush background = new SolidBrush(backColor)) 
     { 
      e.Graphics.FillRectangle(background, e.Bounds); 
      TextRenderer.DrawText(e.Graphics, e.Node.Text, font, e.Bounds, foreColor, TextFormatFlags.GlyphOverhangPadding | TextFormatFlags.SingleLine | TextFormatFlags.EndEllipsis); 
     } 
    } 
} 

Если условия изменяются только аннулирует дерево :

treeView1.Invalidate(); // this will re-draw the visible nodes