加载未知数量的孩子到 TreeNode
Loading unknown amount of childs to TreeNode
我从 API 获取数据,其中为每个用户存储了存档。
每个存档可以有1个到无限个子存档,每个子存档可以有1个到无限个子存档等等。
如何在没有 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
class:
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())
我从 API 获取数据,其中为每个用户存储了存档。 每个存档可以有1个到无限个子存档,每个子存档可以有1个到无限个子存档等等。
如何在没有 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
class:
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())