Флажки Tri-State в WinForms TreeView - PullRequest
14 голосов
/ 11 апреля 2011

У меня есть TreeView, который позволяет пользователям выбирать определенные элементы иерархических данных, устанавливая или снимая флажок каждого элемента. В настоящее время я отключаю флажок на узлах, у которых есть дети, с помощью метода скрытия флажка из другого вопроса , например:

☑ Node 1
☐ Node 2
• Node 3
  ☑ Node 3.1
  ☑ Node 3.2
• Node 4
  ☐ Node 4.1
  ☑ Node 4.2

Но лучшим решением было бы использовать флажки с тремя состояниями для родительских узлов, например:

☑ Node 1
☐ Node 2
☑ Node 3
  ☑ Node 3.1
  ☑ Node 3.2
☒ Node 4
  ☐ Node 4.1
  ☑ Node 4.2

Поскольку эта функциональность была доступна в Win32, мой вопрос заключается в том, как сделать это, не рисуя прямоугольники самостоятельно (например, как пользовательский элемент управления или с использованием списка изображений ). Я совсем не знаком с Win32 API; как можно расширить описанную выше методику, чтобы включить трехуровневые проверки на управляемом элементе управления TreeView?

Ответы [ 3 ]

13 голосов
/ 12 апреля 2011

Этот код может помочь вам, если вы хотите нарисовать смешанный флажок

class MixedCheckBox:Control
{
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(0, 0), Bounds, 
            Text, Font, false, 
            System.Windows.Forms.VisualStyles.CheckBoxState.MixedNormal);
    }
}

Это будет отображать: enter image description here

Удачи!

9 голосов
/ 25 мая 2012

В Code Project теперь есть аккуратное решение, Представление дерева трех состояний

Я сейчас просто исследую, поэтому еще не использовал его.

2 голосов
/ 11 апреля 2011

Вы смотрели на это ? Это похоже на работу. Возможно, это немного устарело (похоже, статья 2004 года), но я уверен, что те же принципы можно распространить на все, что вам нужно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...