将未知数量的孩子加载到 TreeNode

问题描述

我从 API 获取数据,其中为每个用户存储档案。 每个存档可以有 1 到无限个子存档,每个子存档可以有 1 到 ulimited 子存档,依此类推。

如何在没有 400 个循环的情况下将每个存档及其子存档加载到 TreeNode 中。 我想过递归,但我不确定是否有更好的方法

VB 示例:

Sub Main()
    For Each archive in Archives
        TreeView1.Nodes.Add(AllChilds(archive))
    Next
End Sub

Function AllChilds(parent_archive As Archive)
    If parent_archive.Archives.Count > 0 Then
        For Each subArchive As Archive In parent_archive.Archives
            If subArchive.Archives.Count > 0 Then
                TreeView1.Nodes.Add(subArchive.displayName)
                AllChilds(subArchive)
            Else
                Return subArchive
            End If
        Next subArchive
    Else
        Return parent_archive
    End If
End Function

C# 示例:

class SurroundingClass
{
    public void Main()
    {
        foreach (archive as Archive in archives.Archives)
            TreeView1.Nodes.Add(AllChilds(archive));
    }

    private void AllChilds(Archive parent_archive)
    {
        if (parent_archive.Archives.Count > 0)
        {
            foreach (Archive subArchive in parent_archive.Archives)
            {
                if (subArchive.Archives.Count > 0)
                {
                    TreeView1.Nodes.Add(subArchive.displayName);
                    AllChilds(subArchive);
                }
                else
                    return subArchive;
            }
        }
        else
            return parent_archive;
    }
}

解决方法

我假设您有一个 Archive 类,看起来像这样:

Public Class Archive

    Public Property DisplayName As String
    Public ReadOnly Property Archives As List(Of Archive)

End Class

并且您代码中的 ArchivesList(Of Archive) 或其他实现 IEnumerable(Of Archive) 的东西。就像 TreeView 的节点一样,它本质上是一种递归数据结构。因此,递归可能是遍历它并随时构建节点树的最佳方法,例如

Private Sub ArchivesToTreeNodes(archives As IEnumerable(Of Archive),nodes As IList)
    For Each archive In archives
        Dim node As New TreeNode(archive.DisplayName)

        ArchivesToTreeNodes(archive.Archives,node.Nodes)
        nodes.Add(node)
    Next
End Sub

示例用法:

Dim nodes As New List(Of TreeNode)

ArchivesToTreeNodes(Archives,nodes)
TreeView1.Nodes.AddRange(nodes.ToArray())