【问题标题】:Avoid expansion of certain TreeNode nodes upon TreeNode.ExpandAll?避免在 TreeNode.ExpandAll 上扩展某些 TreeNode 节点?
【发布时间】:2011-07-21 07:40:37
【问题描述】:

之前没有人问过这个问题:

当用户执行“全部展开”操作时,避免在 WinForms TreeView 中展开某些 TreeNode 类后代的有效方法是什么,但仍让他通过单击 + 符号展开此类节点?

当然我可以处理BeforeExpand,但我很难将e.Cancel 设置为true,前提是它是ExpandAll 操作。我想知道如何确定这一点?我可以继承 TreeView 并覆盖 ExpandAll ——但不能被覆盖...

【问题讨论】:

  • 简单的问题,没有回复?可能没有我想象的那么简单。

标签: winforms user-interface treeview treenode


【解决方案1】:

似乎标准.NET树视图没有您描述的其他方式:在ExpandAll之前触发标志,处理BeforeExpand并在启用标志时为适当的节点启用e.Cancel。

由于 ExpandAll 方法不是虚拟的,因此您可以遵循以下方法:

  • 从 TreeView 类继承并添加 ExpandAllEx 方法来触发此标志。不是一个好方法,因为您需要在使用树实例的任何地方强制转换为树类。
  • 为 TreeView 类添加一个扩展方法,使用 tree.Tag 属性作为这个标志。对现有代码的更改最少的更有用的方法。

【讨论】:

  • 我了解了这两个选项背后的总体思路,但是我不明白如何准确地实现它们中的任何一个。扩展方法会做什么?如果用户在数字键盘上按下星号,我将如何确保它被触发?同样,如果用户按下星号,我将如何确保触发我的 TreeView 后代中的 ExpandAllEx 而不是 ExpandAll?
  • +1 用于帐户的奉献,根据名称:)
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2020-06-24
    • 2023-03-07
    • 2017-06-06
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多