如何查看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
类型。
错误已更正
有什么简单的方法可以检查展开 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
类型。
错误已更正