Избегать расширения определенных узлов TreeNode на TreeNode.ExpandAll?

Никто не спрашивал этого раньше:

Какой эффективный способ избежать расширения определенных TreeNode класс потомков в WinForms TreeView когда пользователь выполняет функцию "Развернуть все", но все же позволяет ему расширять такие узлы, нажимая на символ +?

Конечно, я могу справиться BeforeExpand, но у меня трудные времена e.Cancel в true только если это ExpandAll операция. Интересно, как я могу это определить? Я мог бы подкласс TreeView и переопределить ExpandAll - но это нельзя переопределить...

2 ответа

Решение

Это работает на 100%. Я думаю. Вздох.

  Private Sub MyTreeViewExpandNodes(ByVal Nodes As TreeNodeCollection)
    For Each Node As TreeNode In Nodes
      If Not (TypeOf Node Is SpecialTreeNode) Then
        Node.Expand()
        MyTreeViewExpandNodes(Node.Nodes)
      End If
    Next
  End Sub

  Private Sub MyTreeView_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyTreeView.KeyDown
    If e.KeyCode = Keys.Multiply Then
      e.Handled = True
      e.SuppressKeyPress = True
      MyTreeViewExpandNodes(MyTreeView.Nodes)
    End If
  End Sub

Похоже, что стандартное.NET treeview не имеет способа, отличного от того, который вы описали: запускает флаг перед ExpandAll, обрабатывает BeforeExpand и включает e.Cancel для соответствующих узлов, когда флаг включен.

Поскольку метод ExpandAll не является виртуальным, у вас есть следующие способы:

  • Наследуйте от класса TreeView и добавьте метод ExpandAllEx, где активируйте этот флаг. Нет хорошего, потому что вам нужно приводить к вашему классу дерева везде, где вы используете экземпляр дерева.
  • Добавьте метод расширения для класса TreeView, где для этого флага используется свойство tree.Tag. Более полезный способ с минимальными изменениями в существующем коде.
Другие вопросы по тегам