首页 > 解决方案 > 这个递归函数如何在没有无限循环的情况下更新 TreeView?

问题描述

我在 vb.net 中有一个代码,可以显示目录的树结构。此代码使用递归子过程 (sub) 来更新 TreeView 节点,而不使用任何这些方法。我想知道这怎么可能。这是代码:

Imports System.IO

Public Class Form1

    Const DirectoryToList As String = "." ' The current in this case

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Defines the first node
        Me.MyTreeView.TopNode = Me.MyTreeView.Nodes.Add(DirectoryToList, DirectoryToList)

        'Tree structure of the first node
        For Each Directory As String In Directory.GetDirectories(DirectoryToList)
            Me.MyTreeView.TopNode.Nodes.Add(Directory, Path.GetFileName(Directory))
            'Recursive
            ListFolderTree(Directory, Me.MyTreeView.TopNode)
        Next
        'Files of the first node
        For Each File As String In Directory.GetFiles(DirectoryToList)
            Me.MyTreeView.TopNode.Nodes.Add(Path.GetFileName(File))
        Next
    End Sub

    ' ListFolderTree is the "strange" sub whose operation I don't understand

    Sub ListFolderTree(ByVal DirectoryActuel As String, ByVal NodeActuel As TreeNode)
        'Recovers the node in which we are
        Dim Node As TreeNode = NodeActuel.Nodes(DirectoryActuel)
        'Directories of this node
        For Each Directory As String In Directory.GetDirectories(DirectoryActuel)
            Node.Nodes.Add(Directory, Path.GetFileName(Directory))
            'Recursive
            ListFolderTree(Directory, Node)
        Next
        'Files for this node
        For Each File As String In Directory.GetFiles(DirectoryActuel)
            Node.Nodes.Add(Path.GetFileName(File))
        Next
    End Sub

End Class

结果是预期的结果,所以是树形结构。你能向我解释一下我对“ListFolderTree”子过程的不理解吗?我知道递归可以获取文件和其他文件夹,它们本身位于树中较高的文件夹中,但是数据如何保存在 TreeView 控件中?

标签: vb.nettreeview

解决方案


在实际目录没有子目录的地方,该部分

    For Each Directory As String In Directory.GetDirectories(DirectoryActuel)
        Node.Nodes.Add(Directory, Path.GetFileName(Directory))
        'Recursive
        ListFolderTree(Directory, Node)
    Next

将是一个没有迭代的循环,因为集合 fromDirectory.GetDirectories(DirectoryActuel)将为空,因此不会进行其他递归调用。


推荐阅读