2011-01-15 20 views

答えて

15

ルートノードが1つのツリーがあると仮定すると、次のコードは常にツリーノードを最も深いところにループし、1つ上のレベルに戻ってゆきます。各ノードのテキストが印刷されます。クラエルールの答えに

TreeNode oMainNode = oYourTreeView.Nodes[0]; 
PrintNodesRecursive(oMainNode); 

public void PrintNodesRecursive(TreeNode oParentNode) 
{ 
    Console.WriteLine(oParentNode.Text); 

    // Start recursion on all subnodes. 
    foreach(TreeNode oSubNode in oParentNode.Nodes) 
    { 
    PrintNodesRecursive(oSubNode); 
    } 
} 
6

更新(私の頭の上から未テスト) (これで彼/彼女のソリューションの最初の2行置き換える):念のために、

foreach (var node in oYourTreeView.Nodes) 
{ 
    PrintNodesRecursive(node); 
} 
+0

ええと、いくつかの根があれば、すべての部分木が吐き出されます。しかし、実際には:いくつかのノードを持つツリーは本当にまれです:-) ああ、それは "彼";) – Krumelur

+0

実際には、これは非常に一般的なphaenommenaです:) 私はいくつかのシナリオを想像することができますそれは有用である。たとえば、企業の部門を含むツリービュー。各部門にはサブ部門などがあります。あなたはおそらくスーパーデパートを持っていないでしょう。 – dzendras

+0

あなたはそうです。私は自分の答えを調整した。タイプミスでした。 – Krumelur

6

レイジーLINQのアプローチをします

private void EnumerateAllNodes() 
{ 
    TreeView myTree = ...; 

    var allNodes = myTree.Nodes 
     .Cast<TreeNode>() 
     .SelectMany(GetNodeBranch); 

    foreach (var treeNode in allNodes) 
    { 
     // Do something 
    } 
} 

private IEnumerable<TreeNode> GetNodeBranch(TreeNode node) 
{ 
    yield return node; 

    foreach (TreeNode child in node.Nodes) 
     foreach (var childChild in GetNodeBranch(child)) 
      yield return childChild; 
} 
12

2つの再帰的拡張メソッドを使用することができます。あなたはmyTreeView.GetAllNodes()またはmyTreeNode.GetAllNodes()を呼び出すことができ、次のいずれかのツリービューは、多くのレベルを持っているため

public static List<TreeNode> GetAllNodes(this TreeView _self) 
{ 
    List<TreeNode> result = new List<TreeNode>(); 
    foreach (TreeNode child in _self.Nodes) 
    { 
     result.AddRange(child.GetAllNodes()); 
    } 
    return result; 
} 

public static List<TreeNode> GetAllNodes(this TreeNode _self) 
{ 
    List<TreeNode> result = new List<TreeNode>(); 
    result.Add(_self); 
    foreach (TreeNode child in _self.ChildNodes) 
    { 
     result.AddRange(child.GetAllNodes()); 
    } 
    return result; 
} 
-1

、再帰関数を実行します。

foreach (TreeNode actualNode in treeView1.Nodes)   // Begin with Nodes from TreeView 
    { 
     AddNodeAndChildNodesToList(actualNode); 
    } 
:ツリービュー内のすべての最初のレベルのノードのために、この関数を呼び出したより

public void AddNodeAndChildNodesToList(TreeNode node) 
    { 
     listBox1.Items.Add(node.Text); // Adding current nodename to ListBox  

     foreach (TreeNode actualNode in node.Nodes) 
     { 
      AddNodeAndChildNodesToList(actualNode); // recursive call 
     } 
    } 

コードはサイトからのものですC# TreeView

1

ノードKeyを一意にする必要はありません。すべてのノードキーを空の文字列("")に設定するだけで、Treeview1.Nodes.Find("", true);を実行してTreeView内のすべてのノードを返すことができます。

関連する問題