Покрасить узел дерева в другой цвет
У меня есть 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;
}
}
}
}
}
}
3 ответа
Вы можете использовать рекурсию для перебора всех ваших узлов.
Что-то вроде:
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);
}
Ваше решение очень медленное, если дерево большое. Просто раскрасьте узлы по требованию, когда вы их рисуете. Для этого вам нужно установить режим рисования:
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
Что ж, если вы хотите, чтобы цвет служил в качестве параметра для вашей функции, вас ничто не остановит.
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);