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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5