首页 > 解决方案 > 检测树视图何时加载节点?

问题描述

我的应用程序使用树视图从文件夹加载文件目录。但是根据文件夹的不同,加载树视图可能需要一段时间,因此我的程序似乎冻结并且树视图在一段时间内是空白的,但事实并非如此。加载更大的文件夹只需要更长的时间。但我想展示一个带有动画 GIF 的图片框,让用户知道一切正常,他们只需要等待。问题是,我似乎找不到发生这种情况的事件。我已经尽我所能,甚至在谷歌上搜索了没有成功的答案。任何帮助,将不胜感激。谢谢你。

代码:

 Private Sub PopulateTreeView(ByVal dir As String, ByVal parentNode As TreeNode)

  picturebox3.visible = true 

        Dim folder As String = String.Empty
        Try
            'Add folders to treeview
            Dim folders() As String = IO.Directory.GetDirectories(dir)
            If folders.Length <> 0 Then
                Dim folderNode As TreeNode = Nothing
                Dim folderName As String = String.Empty
                For Each folder In folders
                    folderName = IO.Path.GetFileName(folder)
                    folderNode = parentNode.Nodes.Add(folderName)
                    folderNode.Tag = "folder"
                    folderNode.Name = "folder"
                    PopulateTreeView(folder, folderNode)
                Next
            End If

            'Add the files to treeview
            Dim files() As String = IO.Directory.GetFiles(dir)
            TreeView1.Nodes(0).Tag = "folder"
            TreeView1.Nodes(0).Name = "folder"
            If files.Length <> 0 Then
                Dim fileNode As TreeNode = Nothing
                For Each file As String In files
                    fileNode = parentNode.Nodes.Add(IO.Path.GetFileName(file))
                    fileNode.Tag = "file"
                    If file.Contains(".html") Or file.Contains(".htm") Or file.Contains(".HTML") Or file.Contains(".HTM") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(1)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(1)
                        fileNode.Name = "html"
                    ElseIf file.Contains(".css") Or file.Contains(".CSS") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(2)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(2)
                        fileNode.Name = "css"
                    ElseIf file.Contains(".js") Or file.Contains(".JS") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(3)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(3)
                        fileNode.Name = "js"
                    ElseIf file.Contains(".php") Or file.Contains(".PHP") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(4)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(4)
                        fileNode.Name = "php"
                    ElseIf file.Contains(".png") Or file.Contains(".PNG") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(5)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(5)
                        fileNode.Name = "png"
                    ElseIf file.Contains(".bmp") Or file.Contains(".BMP") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(6)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(6)
                        fileNode.Name = "bmp"
                    ElseIf file.Contains(".gif") Or file.Contains(".GIF") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(7)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(7)
                        fileNode.Name = "gif"
                    ElseIf file.Contains(".jpg") Or file.Contains(".jpeg") Or file.Contains(".JPG") Or file.Contains(".JPEG") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(8)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(8)
                        fileNode.Name = "jpg"
                    ElseIf file.Contains(".txt") Or file.Contains(".TXT") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(9)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(9)
                        fileNode.Name = "txt"
                    ElseIf file.Contains(".ttf") Or file.Contains(".TTF") Or file.Contains(".otf") Or file.Contains(".OTF") Then
                        fileNode.ImageKey = ImageList1.Images.Keys(10)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(10)
                        fileNode.Name = "font"
                    Else
                        fileNode.ImageKey = ImageList1.Images.Keys(11)
                        fileNode.SelectedImageKey = ImageList1.Images.Keys(11)
                        fileNode.Name = "other"
                    End If
                Next
            End If

        Catch ex As UnauthorizedAccessException
            parentNode.Nodes.Add("Access Denied")
        End Try

标签: vb.nettreeviewloading

解决方案


首先不要使用后台工作者尝试任务、线程或异步

我升级了升技并添加了 onExpand 事件,因此您不需要一次加载所有硬盘。展开后的每个根

还有威胁样本,当您通过威胁更新时,如果没有出现交叉威胁,则需要使用调用。不是 100% 保存。你有基础

Private Sub TreeView1_BeforeExpand(sender As Object, e As TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand
    Dim tr = New Threading.Thread(AddressOf ExpandNode)
    tr.Start(e.Node)
End Sub
Sub UpNode(e As TreeNode, onNod As TreeNode())
    e.Nodes.Clear()
    e.Nodes.AddRange(onNod)
End Sub
Public Sub ExpandNode(e As TreeNode)
    Dim l = PopulateTreeView(e.Tag)
    Me.Invoke(Sub() UpNode(e, l))
End Sub

Private Function PopulateTreeView(ByVal dir As String) As TreeNode()
    Dim Li As New List(Of TreeNode)
    Dim folder As String = String.Empty
    Try
        'Add folders to treeview
        Dim folders() As String = IO.Directory.GetDirectories(dir)
        If folders.Length <> 0 Then
            For Each folder In folders
                Dim Ndir = New TreeNode
                Ndir.Tag = folder
                Ndir.Text = System.IO.Path.GetFileName(folder)
                Ndir.Nodes.Add(".")
                Li.Add(Ndir)
            Next
        End If

        'Add the files to treeview
        Dim files() As String = IO.Directory.GetFiles(dir)
        If files.Length <> 0 Then
            Dim fileNode As TreeNode = New TreeNode
            For Each file As String In files
                fileNode.Tag = file
                fileNode.Text = System.IO.Path.GetFileName(file)
                If file.Contains(".html") Or file.Contains(".htm") Or file.Contains(".HTML") Or file.Contains(".HTM") Then
                    fileNode.Name = "html"
                ElseIf file.Contains(".css") Or file.Contains(".CSS") Then
                    fileNode.Name = "css"
                ElseIf file.Contains(".js") Or file.Contains(".JS") Then
                    fileNode.Name = "js"
                ElseIf file.Contains(".php") Or file.Contains(".PHP") Then
                    fileNode.Name = "php"
                ElseIf file.Contains(".png") Or file.Contains(".PNG") Then
                    fileNode.Name = "png"
                ElseIf file.Contains(".bmp") Or file.Contains(".BMP") Then
                    fileNode.Name = "bmp"
                ElseIf file.Contains(".gif") Or file.Contains(".GIF") Then
                    fileNode.Name = "gif"
                ElseIf file.Contains(".jpg") Or file.Contains(".jpeg") Or file.Contains(".JPG") Or file.Contains(".JPEG") Then
                    fileNode.Name = "jpg"
                ElseIf file.Contains(".txt") Or file.Contains(".TXT") Then
                    fileNode.Name = "txt"
                ElseIf file.Contains(".ttf") Or file.Contains(".TTF") Or file.Contains(".otf") Or file.Contains(".OTF") Then
                    fileNode.Name = "font"
                Else
                    fileNode.Name = "other"
                End If
            Next
            Li.Add(fileNode)
        End If

    Catch ex As UnauthorizedAccessException
        Li.Add(New TreeNode With {.Tag = Nothing, .Name = "Access Denied"})
    End Try
    Return Li.ToArray
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Node = New TreeNode
    Node.Tag = "C:\"
    Node.Text = "C:"
    Node.Nodes.Add(".")
    TreeView1.Nodes.Add(Node)
End Sub

推荐阅读