我正在选择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
//...
//...
//...
}
}
//...
}
有什么想法吗?
谢谢
答案 0 :(得分:20)
您需要使用递归。像这样的方法就足够了
IEnumerable<TreeNode> Collect(TreeNodeCollection nodes)
{
foreach(TreeNode node in nodes)
{
yield return node;
foreach (var child in Collect(node.Nodes))
yield return child;
}
}
然后在你的方法中你可以做到
foreach (var node in Collect(tree.Nodes))
{
// you will see every child node here
}
答案 1 :(得分:6)
这很简单:
void TraverseTree(TreeNodeCollection nodes)
{
foreach (var child in nodes)
{
DoSomethingWithNode(child);
TraverseTree(child.Nodes);
}
}
并将其命名为:
TraverseTree(MyTreeView.Nodes);
答案 2 :(得分:2)
您的错误是c
实际上是Control
类型的变量,它没有节点成员。您需要将其转换为TreeView
类型。
您可以执行以下两种方法之一:
if (c is TreeView)
{
TreeNodeCollection myNodes = ((TreeView) c).Nodes; // <<--- Note the cast
...
}
或
TreeView tv = c as TreeView;
if (tv != null)
{
TreeNodeCollection myNodes = tv.Nodes;
...
}
答案 3 :(得分:1)
我更喜欢简单,这是我的简单解决方案:
protected void TraverseNodes(TreeNodeCollection nodes, string action, int maxDepth = 2)
{
foreach (TreeNode node in nodes)
{
if (node.ChildNodes.Count > 0 && node.Depth < maxDepth)
TraverseNodes(node.ChildNodes, action, maxDepth);
//do something!!!
var x = node.Text;
node.Checked = !node.Checked;
}
}
我决定加入一个&#34;最大深度&#34;作为奖励,所以尽情享受。
请按以下方式调用:
TraverseNodes(this.Activities.Nodes, "");
与此处发布的一些示例不同,我实际测试了这个(哎哟!我可以听到他们说)。
答案 4 :(得分:0)
试试这个
foreach (TreeNode t in tvMenu.Nodes)
{
for (int iParent = 0; iParent < t.ChildNodes.Count; iParent++)
{
for (int iChild = 0; iChild < t.ChildNodes[iParent].ChildNodes.Count; iChild++)
{
if (t.ChildNodes[iParent].ChildNodes[iChild].Text == "")
{
}
}
}
}
答案 5 :(得分:0)
在Darren的最佳答案之上,你可以结合递归和类扩展。
在命名空间中的某处声明:
public static class MyExtensions
{
public static IEnumerable<TreeNode> All( this TreeNodeCollection nodes )
{
foreach( TreeNode n in nodes )
{
yield return n;
foreach( TreeNode child in n.Nodes.All( ) )
yield return child;
}
}
}
在方法的第一个参数之前注意“this”。
然后,您可以在所有树视图中使用此新方法:
foreach( TreeNode n in myTreeview.Nodes.All() ) ...