2011-01-15 2 views
6

Как я могу получить список всех узлов дерева (на всех уровнях) в элементе управления TreeView?Получить список всех узлов дерева (на всех уровнях) в элементах управления TreeView

+2

Если вас устраивает ответ, было бы хорошо, если бы вы его приняли. Благодарю. – Krumelur

ответ

15

Предполагая, что у вас есть дерево с одним корневым узлом, следующий код всегда будет зацикливать узлы дерева до самого глубокого, затем перейдите на один уровень назад и так далее. Он будет печатать текст каждого узла. (Непроверенные из верхней части моей головы)

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 для ответа Крумелер (в заменить 2 первые строки его/ее решение с этим):

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

Да, тогда он выплюнет все поддеревья, если будет несколько корней. Но на самом деле: дерево с несколькими узлами действительно редко в природе :-) О, и это «его»;) – Krumelur

+0

На самом деле, в природе это довольно распространенная фаеномена :) В программировании я могу себе представить несколько сценариев где это полезно. Например: treeview, содержащие отделы компании, каждый из которых имеет поддепозиты и т. Д. У вас, вероятно, не будет супердепартамента. – 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

Вы можете использовать два метода рекурсивного расширения. Вы можете либо позвонить 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

Поскольку TreeView имеет много уровней, сделать рекурсивную функцию:

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

Чем вызвать эту функцию для всех первых узлов уровня в TreeView:

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

Код с сайта C# TreeView

1

Если вы d не нужно, чтобы ключ узла был уникальным, просто установите все ключи узла на пустую строку (""), затем вы можете сделать Treeview1.Nodes.Find("", true);, чтобы вернуть все узлы в TreeView.

Смежные вопросы