Checkbox в TreeView у конкретных узлов - C#
Формулировка задачи:
Доброе время суток.
Есть TreeView, у определенных узлов которого требуются checkbox'ы. Если выставить свойство checkbox, то они будут отображаться у каждого узла.
Копаю в сторону OwnerDraw и переопределения события DrawNode. Но там заминка - не знаю, как, если перерисовываешь узел и не рисуешь checkbox, нарисовать плюс/минус раскрытия/закрытия подузлов.
//========== Прорисовка узлов дерева ==================== private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e) { //-- Если это нужный узел, то не рисуем checkbox if (e.Node.Text.Equals("Нужный узел:")) { Color backColor, foreColor; //-- В зависимости от ситуации выбираем цвет фона if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected) { backColor = SystemColors.Highlight; foreColor = SystemColors.HighlightText; } else if ((e.State & TreeNodeStates.Hot) == TreeNodeStates.Hot) { backColor = SystemColors.HotTrack; foreColor = SystemColors.HighlightText; } else { backColor = e.Node.BackColor; foreColor = e.Node.ForeColor; } using (SolidBrush brush = new SolidBrush(backColor)) { e.Graphics.FillRectangle(brush, e.Node.Bounds); } TextRenderer.DrawText(e.Graphics, e.Node.Text, this.treeViewMain.Font, e.Node.Bounds, foreColor, backColor); if ((e.State & TreeNodeStates.Focused) == TreeNodeStates.Focused) { ControlPaint.DrawFocusRectangle(e.Graphics, e.Node.Bounds, foreColor, backColor); } e.DrawDefault = false; } else { e.DrawDefault = true; } }
Решение задачи: «Checkbox в TreeView у конкретных узлов»
textual
Листинг программы
public partial class Form1 : Form { public Form1() { InitializeComponent(); var ft = new FastTree() {Parent = this, Dock = DockStyle.Fill, ShowCheckBoxes = true}; ft.NodeCheckBoxVisibleNeeded += ft_NodeCheckBoxVisibleNeeded; var root = new Node("Root"); var n = new Node(); var subNode = new Node(); n = new Node("Кресло"); root.AddChild(n); subNode = new Node("Кресло мягкое"); n.AddChild(subNode); subNode = new Node("Кресло твёрдое"); n.AddChild(subNode); subNode = new Node("Кресло красное"); n.AddChild(subNode); n = new Node("Стул"); root.AddChild(n); subNode = new Node("Стул - Табуретка"); n.AddChild(subNode); subNode = new Node("Стул - пуфик"); n.AddChild(subNode); ft.Build(root); } void ft_NodeCheckBoxVisibleNeeded(object sender, BoolNodeEventArgs e) { switch((e.Node as Node).Title) { case "Стул - Табуретка": case "Стул - пуфик": e.Result = false; return; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д