如何检查TreeNode的所有子节点是否都已扩展?

时间:2017-06-07 12:09:49

标签: c# treeview treenode

有没有简单的方法来检查扩展TreeNode及其子节点的状态?

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

2 个答案:

答案 0 :(得分:1)

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

你想要做的基本上是一个tree traversal,它是遍历树的所有子节点的过程。基本上我们需要检查 all 节点的后代(而不是子节点)。孩子和后代之间的区别在于孩子们共享同一个父母(例如,当且仅当AB和C与X直接相关时,ABC是X的孩子),而后代可能是“孩子的孩子的孩子......” (例如:A是X的后代,如果从X开始,树上有路径,从节点X开始,向下到节点A )。

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

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类型。 错误纠正

答案 1 :(得分:-1)

您可以引入自己的类TreeNode,而不是使用TreeNode。这个类可以有一个递归方法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;
  }
}