2011-01-15 36 views

Trả lời

15

Giả sử bạn có một cây với một nút gốc, mã sau sẽ luôn luôn lặp lại các nút cây xuống sâu nhất, sau đó đi một cấp trở lại và cứ tiếp tục như vậy. Nó sẽ in văn bản của mỗi nút. (chưa được kiểm tra từ đỉnh đầu của tôi)

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

Update để trả lời Krumelur của (thay thế 2 dòng đầu tiên của/giải pháp của mình với điều này):

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

Vâng, sau đó nó sẽ nhổ ra tất cả các subtrees nếu có một số rễ. Nhưng thực sự: một cái cây với một vài nút là một thực tế hiếm khi trong tự nhiên :-) Ồ, và nó là "của anh ấy") – Krumelur

+0

Trong thực tế, trong tự nhiên đây là một phaenommena khá phổ biến :) Trong lập trình tôi có thể tưởng tượng một vài kịch bản nơi nó hữu ích. Ví dụ: treeview chứa các phòng ban của một công ty, mỗi phòng có các phân khu và v.v. Bạn có lẽ sẽ không có bất kỳ superdepartment. – dzendras

+0

Bạn nói đúng. Tôi đã điều chỉnh câu trả lời của mình. Là một lỗi đánh máy. – Krumelur

6

Lazy LINQ cách tiếp cận, chỉ trong trường hợp bạn đang tìm kiếm một cái gì đó như thế này:

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

Bạn có thể sử dụng hai phương pháp mở rộng đệ quy. Bạn có thể gọi myTreeView.GetAllNodes() hoặc 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

Vì TreeView có nhiều cấp độ, làm chức năng đệ quy:

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 
     } 
    } 

Thân gọi chức năng này cho tất cả các nút cấp độ đầu tiên trong TreeView:

foreach (TreeNode actualNode in treeView1.Nodes)   // Begin with Nodes from TreeView 
    { 
     AddNodeAndChildNodesToList(actualNode); 
    } 

Mã từ trang web C# TreeView

1

Nếu bạn d không cần chìa khóa nút là duy nhất, chỉ cần đặt tất cả các nút của nút thành một chuỗi trống (""), sau đó bạn có thể thực hiện Treeview1.Nodes.Find("", true); để trả về tất cả các nút trong TreeView.

Các vấn đề liên quan