Как получить список всех дочерних узлов в TreeView в.NET

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

Массивы являются ссылочными типами , поэтому, когда вы присваиваете их другой переменной, вы копируете только справочную информацию , а не содержимое. Если вы измените содержание, все ссылки будут отражать, что

Вы можете использовать Array.Copy для копирования значений в данный момент времени из originalArray

[ 110]

Заметьте , это полностью не проверено, и я понятия не имею, работает ли остальная часть вашего кода как задумано


Дополнительно Ресурсы

Метод Array.Copy

Копирует диапазон элементов из одного массива в другой массив и выполняет приведение типов и упаковку по мере необходимости. [ 1115] blockquote>

Массивы (Руководство по программированию в C #)

Типы массивов - это ссылочные типы, полученные из абстрактного базового типа Array . Поскольку этот тип реализует IEnumerable и IEnumerable, вы можете использовать итерацию foreach для всех массивов в C #.

BLOCKQUOTE>

16
задан Matt Hanson 7 October 2008 в 05:02
поделиться

6 ответов

Используйте рекурсию

Function GetChildren(parentNode as TreeNode) as List(Of String)
  Dim nodes as List(Of String) = New List(Of String)
  GetAllChildren(parentNode, nodes)
  return nodes
End Function

Sub GetAllChildren(parentNode as TreeNode, nodes as List(Of String))
  For Each childNode as TreeNode in parentNode.Nodes
    nodes.Add(childNode.Text)
    GetAllChildren(childNode, nodes)
  Next
End Sub
19
ответ дан 30 November 2019 в 15:14
поделиться

Вам нужна рекурсивная функция, чтобы сделать это [или эквивалентный цикл, но рекурсивная версия более проста] - псевдокод:

function outputNodes(Node root)
    writeln(root.Text)
    foreach(Node n in root.ChildNodes)
        outputNodes(n)
    end
end
13
ответ дан 30 November 2019 в 15:14
поделиться

Вот отрывок кода, который я использую для выполнения этой задачи от моей оперативной библиотеки.
Это позволяет Вам перечислять узлы или глубина сначала или дыхание сначала без использования рекурсии, которая имеет издержки построения стековых фреймов в механизме JIT. Его очень быстрое.

Для использования его просто пойдите:

List< TreeNode > nodes = TreeViewUtils.FlattenDepth(tree);

Извините, у Вас есть тег VB.Net; я не могу дать пример, но я уверен, что Вы разработаете его.

public class TreeViewUtils
{
    /// <summary>
    /// This static utiltiy method flattens all the nodes in a tree view using
    /// a queue based breath first search rather than the overhead
    /// of recursive method calls.
    /// </summary>
    /// <param name="tree"></param>
    /// <returns></returns>
    public static List<TreeNode> FlattenBreath(TreeView tree) {
        List<TreeNode> nodes = new List<TreeNode>();

        Queue<TreeNode> queue = new Queue<TreeNode>();

        //
        // Bang all the top nodes into the queue.
        //
        foreach(TreeNode top in tree.Nodes) {
            queue.Enqueue(top);
        }

        while(queue.Count > 0) {
            TreeNode node = queue.Dequeue();
            if(node != null) {
                //
                // Add the node to the list of nodes.
                //
                nodes.Add(node);

                if(node.Nodes != null && node.Nodes.Count > 0) {
                    //
                    // Enqueue the child nodes.
                    //
                    foreach(TreeNode child in node.Nodes) {
                        queue.Enqueue(child);
                    }
                }
            }
        }
        return nodes;
    }

    /// <summary>
    /// This static utiltiy method flattens all the nodes in a tree view using
    /// a stack based depth first search rather than the overhead
    /// of recursive method calls.
    /// </summary>
    /// <param name="tree"></param>
    /// <returns></returns>
    public static List<TreeNode> FlattenDepth(TreeView tree) {
        List<TreeNode> nodes = new List<TreeNode>();

        Stack<TreeNode> stack = new Stack<TreeNode>();

        //
        // Bang all the top nodes into the queue.
        //
        foreach(TreeNode top in tree.Nodes) {
            stack.Push(top);
        }

        while(stack.Count > 0) {
            TreeNode node = stack.Pop();
            if(node != null) {

                //
                // Add the node to the list of nodes.
                //
                nodes.Add(node);

                if(node.Nodes != null && node.Nodes.Count > 0) {
                    //
                    // Enqueue the child nodes.
                    //
                    foreach(TreeNode child in node.Nodes) {
                        stack.Push(child);
                    }
                }
            }
        }
        return nodes;
    }
}
13
ответ дан 30 November 2019 в 15:14
поделиться

У меня есть метод расширения, который я использую для этого:

public static IEnumerable<TreeNode> DescendantNodes( this TreeNode input ) {
    foreach ( TreeNode node in input.Nodes ) {
        yield return node;
        foreach ( var subnode in node.DescendantNodes() )
            yield return subnode;
        }
}

Это C #, но на него можно ссылаться из VB или преобразовать в него.

12
ответ дан 30 November 2019 в 15:14
поделиться

Я преобразовал код в VB.Net , получив в результате следующее:

Public Function FlattenBreadth(ByVal tree As TreeView) As List(Of TreeNode)
    Dim nodes As New List(Of TreeNode)
    Dim queue As New Queue(Of TreeNode)
    Dim top As TreeNode
    Dim nod As TreeNode
    For Each top In tree.Nodes
        queue.Enqueue(top)
    Next
    While (queue.Count > 0)
        top = queue.Dequeue
        nodes.Add(top)
        For Each nod In top.Nodes
            queue.Enqueue(nod)
        Next
    End While
    FlattenBreadth = nodes
End Function
2
ответ дан 30 November 2019 в 15:14
поделиться
nodParent As TreeNode
'nodParent = your parent Node
tvwOpt.Nodes.Find(nodParent.Name, True)

Вот и все

1
ответ дан 30 November 2019 в 15:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: