2013-10-29 63 views
3

比方說,我有這樣一個樹形視圖:店孫節點在C#(的WinForms)在列表從TreeView的文本

1 
|_2 
    |_3 
    |_4 
|_5 
    |_6 
    |_7 

我需要捕獲從所有節點上的文字這棵樹的2級。

如果我不喜歡這樣:

List<string> list = new List<string>(); 
foreach(TreeNode node in treeView1.Nodes[0].Nodes[0].Nodes.Count) 
{ 
     list.Add(node.Text); 
} 

這隻會捕獲第一兩個孫子(3和4),但圖6和7不會被捕獲。有沒有什麼方法可以在不考慮父母的情況下迭代樹視圖的層次?

+1

那是因爲你總是通過使用'Nodes [0] .Nodes [0]'來稱它爲第一個孫子。第二個'Nodes [0]'調用應該是動態的。 –

+0

你說得對。使用來自節點[0]的計數封裝for循環中的foreach .nodes完成工作。 – shingonati0n

回答

3

您可以使用LINQ:

var nodes = treeView1.Nodes 
       .Cast<TreeNode>() 
       .SelectMany(n => n.Nodes.Cast<TreeNode>()) 
       .SelectMany(n => n.Nodes.Cast<TreeNode>()); 

foreach(TreeNode node in nodes) 
{ 
     list.Add(node.Text); 
} 

這裏是一個通用的解決方案:

public static IEnumerable<TreeNode> GetNodesByDepth(TreeView treeView, int depth) 
{ 
    var nodes = treeView.Nodes.Cast<TreeNode>(); 
    for (int i=0; i < depth; i++) 
     nodes = nodes.SelectMany(n => n.Nodes.Cast<TreeNode>()); 
    return nodes; 
} 

完整的例子:

public class Program 
{ 
    public static IEnumerable<TreeNode> GetNodesByDepth(TreeView treeView, int depth) 
    { 
     var nodes = treeView.Nodes.Cast<TreeNode>(); 
     for (int i = 0; i < depth; i++) 
      nodes = nodes.SelectMany(n => n.Nodes.Cast<TreeNode>()); 
     return nodes; 
    } 
    static void Main(string[] args) 
    { 
     TreeView treeView = new TreeView(); 

     TreeNode node1 = new TreeNode("1"); 
     TreeNode node2 = new TreeNode("2"); 
     TreeNode node3 = new TreeNode("3"); 
     TreeNode node4 = new TreeNode("4"); 
     TreeNode node5 = new TreeNode("5"); 
     TreeNode node6 = new TreeNode("6"); 
     TreeNode node7 = new TreeNode("7"); 

     treeView.Nodes.Add(node1); 
     node1.Nodes.Add(node2); 
     node1.Nodes.Add(node5); 
     node2.Nodes.Add(node3); 
     node2.Nodes.Add(node4); 
     node5.Nodes.Add(node6); 
     node5.Nodes.Add(node7); 

     Console.WriteLine("Method 1:"); 
     var nodes = treeView.Nodes 
      .Cast<TreeNode>() 
      .SelectMany(n => n.Nodes.Cast<TreeNode>()) 
      .SelectMany(n => n.Nodes.Cast<TreeNode>()); 

     foreach (TreeNode node in nodes) 
     { 
      Console.WriteLine(node.Text); 
     } 

     Console.WriteLine(); 
     Console.WriteLine("----------------"); 
     Console.WriteLine("Method 2:"); 
     nodes = GetNodesByDepth(treeView, 2); 

     foreach (TreeNode node in nodes) 
     { 
      Console.WriteLine(node.Text); 
     } 
    } 
} 
+0

此表達式: nodes.SelectMany(n => n.Nodes) 給出一個ArgumentNullException。 – shingonati0n

+0

@ shingonati0n我改正了答案。編輯您的代碼並重試。 –

+0

@ shingonati0n再次糾正,對不起! –

1

首先,感謝@Ahmed KRAIEM,他的方法是有效的,儘管我根據@Andrei V提示完成了它。

我最終使用的解決方案是這樣的:

for (int i = 0; i < trv.Nodes[0].Nodes.Count; i++) 
      { 
       foreach (TreeNode nodo in trv.Nodes[0].Nodes[i].Nodes) 
       { 
        ordenes.Add(Convert.ToInt32(nodo.Text)); 
       } 
      } 

這得到節點的水平也。

相關問題