Получить список всех узлов дерева (на всех уровнях) в элементах управления TreeView - PullRequest
9 голосов
/ 15 января 2011

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

Ответы [ 6 ]

23 голосов
/ 21 июля 2014

Вы можете использовать два рекурсивных метода расширения.Вы можете позвонить 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.Nodes)
    {
        result.AddRange(child.GetAllNodes());
    }
    return result;
}
17 голосов
/ 16 января 2011

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

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);
  }
}
9 голосов
/ 12 января 2014

Lazy 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;
}
6 голосов
/ 16 января 2011

Обновление до ответа Крумелура (замените две первые строки его / ее решения этим):

foreach ( var node in oYourTreeView.Nodes )
{
    PrintNodesRecursive( node );
}
1 голос
/ 21 августа 2015

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

0 голосов
/ 26 апреля 2015

Поскольку 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...