如何查看TreeNode的所有子节点是否展开?

How to check if all subnodes of TreeNode are expanded?

有什么简单的方法可以检查展开 TreeNode 及其子节点的状态吗?

bool IsAllNodesExpanded(TreeNode nodeToCheck)
{
  // Use nodeToCheck.isExpanded
  // Use something to check all childrens
  // return something
}

您可以引入自己的 class,而不是使用 TreeNode,它源自 TreeNode。这个 class 可以有一个递归方法 IsAllNodesExpanded 像这样:(未测试)

public class MyTreeNode : TreeNode
{
  public bool IsAllNodesExpanded()
  {
    if (!IsExpanded)
    {
      return false;
    }

    bool allChildsExpanded = true;

    foreach (MyTreeNode child in Nodes.OfType<MyTreeNode>())
    {
      if (!child.IsAllNodesExpanded())
      {
        allChildsExpanded = false;
        break;
      }
    }

    return allChildsExpanded;
  }
} 

由于您的问题特定于特定的 WinForm 组件,但我要写给您的解决方案更为通用。因此,我将考虑一般树向您解释我的解决方案,但我将为您提供的代码解决了 您自己的 问题。

你想要做的基本上是一个 tree traversal,这是遍历给定它的根的树的所有 children 的过程。基本上我们需要检查是否 all 个节点的后代(不是 children)。 children 和后代之间的区别是 children 共享相同的 parent (例如 A B C 是 X 的 children 当且仅当 A B 和 C 直接连接到 X) ,而后代可能是“children of children of children...of children(例如:A 是 X 的后代,如果从 X 开始,有一个path 在树上,从节点 X 开始,向下 到节点 A)。

为了访问一棵树的所有后代,我们需要一个递归函数。在我们的例子中,函数 returns 是一个布尔值,它告诉我们是否扩展了特定起始节点的所有后代。 有一个示例代码可以完全满足您的要求:

bool areAllNodesExpanded(TreeNode nodeToCheck){

    if(!nodeToCheck.IsExpanded)
        return false;
    foreach(TreeNode n in nodeToCheck.Nodes){
        if (n.Nodes.Count == 0)
            continue;
        if(!areAllNodesExpanded(n))
            return false;
    }
    return true;
}

希望这对您有所帮助。

LuxGiammi

编辑:由于我犯了两个错误,无法编译上面的代码片段: 1. 它是 IsExpanded 而不是 isExpanded 2. 由于某些原因我不想进一步调查,var n 是 object 类型,而它应该是 TreeNode 类型。 错误已更正