Treeview UnauthorizedAccessExeption LANGSAM

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Kaypetri.

    Treeview UnauthorizedAccessExeption LANGSAM

    Hallo Ihr Spezialisten. Seit laaaangem melde ich mich mal wieder. Ichhabe ein kleines Problem beim erstellen eines Treeview von Drive C:.

    Da ich nicht auf alle Ordner Zugriff habe, ist es mir nicht möglich den Inhalt dieser Ordner darzustellen. Daher habe ich das dann mit Try - Catch einfach raus genommen. Problem nun. Wird ein Ordner als Pfad selektiert der wie C: viele fehlende Berechtigungen besitzt so ist der Code recht langsam. Bis C im Treeview dargestellt wird dauert es dann schonmal ca. 10 Sekunden. Meine Frage an euch. Wie kann ich das verbessern? Evtl. versteckte Ordner oder Recycle nicht mit einbeziehen? Hier der Code zur Auflistung:

    Visual Basic-Quellcode

    1. ​Private Sub PopulateTreeView()
    2. Dim rootNode As TreeNode
    3. Dim info As New DirectoryInfo(startfolder)
    4. If info.Exists Then
    5. rootNode = New TreeNode(info.Name)
    6. rootNode.Tag = info
    7. GetDirectories(info.GetDirectories(), rootNode)
    8. TreeView1.Nodes.Add(rootNode)
    9. End If
    10. End Sub
    11. Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo,
    12. ByVal nodeToAddTo As TreeNode)
    13. Dim aNode As TreeNode
    14. Dim subSubDirs() As DirectoryInfo
    15. Dim subDir As DirectoryInfo
    16. For Each subDir In subDirs
    17. Try
    18. aNode = New TreeNode(subDir.Name, 0, 0)
    19. aNode.Tag = subDir
    20. aNode.ImageKey = "folder"
    21. subSubDirs = subDir.GetDirectories()
    22. If subSubDirs.Length <> 0 Then
    23. GetDirectories(subSubDirs, aNode)
    24. End If
    25. nodeToAddTo.Nodes.Add(aNode)
    26. Catch ex As UnauthorizedAccessException
    27. ' MsgBox(Err.Description)
    28. End Try
    29. Next subDir
    30. End Sub


    Der Pfad wird über "StartFolder" via Button und FolderBrowserDialog erledigt.
    @Kaypetri Wenn Du da viele Items anhängst, solltest Du das permanente Update dazu unterbinden.

    VB.NET-Quellcode

    1. TreeView1.SuspendLayout()
    2. ' ... was tun
    3. TreeView1.PerformLayout()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Kaypetri wie viele Daten hängst Du denn an den TreeView?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du könntest das Ganze auch iterativ lösen (mit Hilfe eines Stacks of TreeNode), das wäre ein klein wenig schneller.
    Aber der bessere Ansatz wäre vielleicht immer nur die sichtbaren Nodes und eine Ebene darunter hinzuzufügen.
    "Delayed Loading" könnte man das nennen. Und im BeforeExpand Event des TreeViews fügst du die fehlenden Nodes für die nächste Ebene dann hinzu.
    Das ist meine Signatur und sie wird wunderbar sein!
    Ja. So ist das im Grunde. Der Treenode zeigt immer nur die 1. Ebene und wird nicht gleich aufgeklappt. Das Problem der Geschwindigkeit scheint mir bei der Ausfilterung der Folder wo ich keine Berechtigung habe. Im grunde akkert der ja das ganze C: durch und sucht erstmal die Access-Fehler und dann befüllt er die Treenode.