问题描述
我从 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
并且您代码中的 Archives
是 List(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())