检测树视图何时加载节点? [英] Detecting when a treeview loads nodes?

查看:89
本文介绍了检测树视图何时加载节点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My application uses a treeview to load a directory of files from a folder. But depending on the folder, it may take a while for the treeview to load so my program appears to freeze and the treeview is blank for some time but that is not the case. It just takes a longer time to load for larger folders. But I want to show a picturebox with an animated GIF in it to let the user know that everything is ok and they just need to wait. The problem is, I can't seem to find the event for this to happen. I have tried everything I can and even searched on Google for the answer to no success. Any help would be appreciated. Thank you.

代码:

 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

推荐答案

您可以使用Async/Await模式在不冻结UI的情况下在其他线程中加载数据,然后将数据添加到树中.

You can use Async / Await pattern to load data at a different thread without freezing UI and then add data to tree.

另外,当将节点添加到树中时,请使用AddRange,或者如果您一个接一个地添加,请在第一个节点之前调用BeginUpdate,在最后一个节点之后调用EndUpdate.例如,您可以看到如何通过在不同的线程中进行5秒的虚拟延迟而不冻结UI来添加两个节点:

Also when adding nodes to tree, use AddRange or if you add one by one, call BeginUpdate before first node, and EndUpdate after last node. For example you can see how I added two nodes by making a 5 seconds dummy delay in a different thread without freezing UI:

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Await AddNodes()
End Sub

Private Async Function AddNodes() As Task
    PictureBox1.Show()
    PictureBox1.Update()
    Await Task.Delay(5000)
    Dim Nodes = New List(Of TreeNode)() From {New TreeNode("1"), New TreeNode("2")}
    TreeView1.Nodes.AddRange(Nodes.ToArray())
    PictureBox1.Hide
End Function

这篇关于检测树视图何时加载节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆