Избегать расширения определенных узлов 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. Более полезный способ с минимальными изменениями в существующем коде.