Обнаружение, когда дерево загружает узлы? - PullRequest
0 голосов
/ 27 июня 2018

Мое приложение использует древовидную структуру для загрузки каталога файлов из папки. Но в зависимости от папки загрузка дерева может занять некоторое время, поэтому моя программа зависает, и дерево некоторое время остается пустым, но это не так. Загрузка больших папок занимает больше времени. Но я хочу показать картинку с анимированным GIF-файлом, чтобы пользователь знал, что все в порядке, и ему просто нужно подождать. Проблема в том, что я не могу найти событие для этого. Я перепробовал все, что мог, и даже искал в Google ответ безуспешно. Любая помощь будет оценена. Спасибо.

Код:

 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

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

first Не использовать фоновую рабочую задачу, поток или асинхронную работу

Я обновляю abit и добавляю событие onExpand, чтобы вам не нужно было загружать все hardrive за один запуск. каждый корень после расширения

есть также пример угрозы, при обновлении через угрозу вам нужно использовать Invoke, если не обнаруживается перекрестная угроза. Не экономит на 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
0 голосов
/ 27 июня 2018

Вы можете использовать шаблон Async / Await для загрузки данных в другой поток без зависания пользовательского интерфейса, а затем добавить данные в дерево.

Также при добавлении узлов в дерево используйте AddRange или, если вы добавляете один за другим, вызывайте BeginUpdate перед первым узлом и EndUpdate после последнего узла. Например, вы можете увидеть, как я добавил два узла, сделав фиктивную задержку в 5 секунд в другом потоке без зависания интерфейса:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...