Поиск на сайте
Главная Журнал Форум Wiki DRKB Страны мира

Трёхпозиционные чекбоксы в TreeView

TreeView с чекбоксами, реализованный во фреймворке (свойство TreeView.CheckBoxes = True) позволяет использовать только 2 состояния (TreeNode.Checked = True или False). Ниже приведена реализация дерева с трёхпозиционными чекбоксами, позволяющая:

• использовать список изображений состояний, который отсутствует в .NET Framework.
• использовать 3 состояния (4 включая состояние "none") для ноды: отмечена, не отмечена, не полностью отмечена.
• автоматически отслеживать и устанавливать состояние родительских и дочерних нод при смене пользователем состояния любой из нод (полная или частичная установка состояний).

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

Код

Для начала унаследуем класс TriStateTreeView от базового TreeView. Для нового класса необходим список изображений состояний с иконками для 4 состояний: нет, не отмечено, отмечено, частично отмечено (именно в таком порядке).

Передаём список изображений состояний в конструктор:

  m_ctlTriStateTreeView = New TriStateTreeView(Me.StateImageList)

Так же объявляем перечисление с состояниями:

Friend Enum CheckBoxState
   None = 0
   Unchecked = 1
   Checked = 2
   Indeterminate = 3
End Enum

Для добавления нод в дерево можно использовать вспомогательную функцию AddTreeNode класса TriStateTreeView:

 objTreeNodeRoot = m_ctlTriStateTreeView.AddTreeNode( _
    m_ctlTriStateTreeView.Nodes, "My Computer", _
    IMG_COMPUTER, CheckBoxState.None)

Функция GetTreeNodeState класса TriStateTreeView позволяет узнать состояние ноды:

 Friend Function GetTreeNodeState(ByVal objTreeNode As _
    TreeNode) As CheckBoxState

Для установки состояния ноды используется функция SetTreeNodeState класса TriStateTreeView:

Friend Sub SetTreeNodeState(ByVal objTreeNode As _
    TreeNode, ByVal eCheckBoxState As CheckBoxState)

Важные моменты

Для изменения состояния ноды код перехватывает события MouseUp и KeyUp (клик мышкой или нажатие клавиши). Кроме того, данная реализация защищает от раскрытия или сворачивания ноды при двойном клике на чекбоксе.

Скачать демонстрационный проект - 21 кб




Основные разделы сайта


 

Реклама Вызов врача на дом платно в платной клинике рядом с Войковской