Jea*_*ean 1 c# treeview loops nodes
我正在选择我所拥有的所有控件 form
如果是控件Treeviews,我将迭代他们拥有的所有节点
我需要类似的东西:(这是我的代码)
foreach (Control c in PanelSM.Controls)
{
if (c is TreeView)
{
TreeNodeCollection myNodes = c.Nodes;//<<<<< Here is a mistake
foreach (TreeNode n in myNodes)
{
String text = rm.GetString(n.Name);
//And more things
//...
//...
//...
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
任何的想法?
谢谢
Dar*_*opp 24
你需要使用递归.像这样的方法就足够了
IEnumerable<TreeNode> Collect(TreeNodeCollection nodes)
{
foreach(TreeNode node in nodes)
{
yield return node;
foreach (var child in Collect(node.Nodes))
yield return child;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在你的方法中你可以做到
foreach (var node in Collect(tree.Nodes))
{
// you will see every child node here
}
Run Code Online (Sandbox Code Playgroud)
这很简单:
void TraverseTree(TreeNodeCollection nodes)
{
foreach (var child in nodes)
{
DoSomethingWithNode(child);
TraverseTree(child.Nodes);
}
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
TraverseTree(MyTreeView.Nodes);
Run Code Online (Sandbox Code Playgroud)
小智 2
您的错误是,它c实际上是类型的变量Control,它没有Nodes成员。您将需要它来将其转换为TreeView类型。
您可以采用以下两种方法之一:
if (c is TreeView)
{
TreeNodeCollection myNodes = ((TreeView) c).Nodes; // <<--- Note the cast
...
}
Run Code Online (Sandbox Code Playgroud)
或者
TreeView tv = c as TreeView;
if (tv != null)
{
TreeNodeCollection myNodes = tv.Nodes;
...
}
Run Code Online (Sandbox Code Playgroud)