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