IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

VB.NET Chargement optimisé du treeview [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut VB.NET Chargement optimisé du treeview
    Bonjour,
    Bon voila la suite de mes problèmes avec le treeview (treeview et moi ça fait 2).
    Sur mon ancien post je demandais de l'aide pour pouvoir charger le treeview du (C:\) sans les dossier protégés.
    Le post a été résolut grâce à Wallace1 (encore une fois) sauf que le chargement s'en est trouvé très long (12s).
    On me dit :
    "Si tu veux accélérer le chargement des données, tu peux au début ne charger que les deux premiers niveaux de l'arborescence. Ensuite lorsque l'utilisateur déplie un nœud, tu vas chercher les deux sous-niveaux suivants, et ainsi de suite."
    J'ai beau chercher sur d'autres forum et site, je ne trouve rien de concluant.
    J'ai vu qu'on pouvait utiliser le "VirtualizingStackPanel.IsVirtualizing" (je sais même pas à quoi ça sert, c'est mal expliqué dans msdn.microsoft) et aussi la propriété "expand" mais je sais pas où les placer dans le code ni comment s'en servir.

    Quelqu'un pour m'aider?

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Imports System.IO
    Public Class Form2
     
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
        End Sub
     
        Private Sub PopulateTreeView()
            Dim rootNode As TreeNode
            Dim info As New DirectoryInfo("C:\")
     
            If info.Exists Then
                rootNode = New TreeNode(info.Name)
                rootNode.Tag = info
                rootNode.Expand()
                GetDirectories(info.GetDirectories(), rootNode)
                TreeView1.Nodes.Add(rootNode)
            End If
        End Sub
     
        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
     
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            For Each subDir In subDirs
                aNode = New TreeNode(subDir.Name, 0, 0)
                aNode.Tag = subDir
                aNode.ImageKey = "folder"
                Try
                    subSubDirs = subDir.GetDirectories()
                Catch e As UnauthorizedAccessException
                    subSubDirs = Nothing
                End Try
                If Not subSubDirs Is Nothing Then
                    If subSubDirs.Length <> 0 Then
                        GetDirectories(subSubDirs, aNode)
                    End If
                End If
                If Not subDir.Attributes = (FileAttributes.Hidden Or subDir.Attributes) Then
                    nodeToAddTo.Nodes.Add(aNode)
                End If
            Next subDir
        End Sub
     
        Public Sub New()
            InitializeComponent()
            PopulateTreeView()
        End Sub 'New

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    VirtualizingStackPanel c'est en wpf, ca n'existe pas en windows forms

    http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx
    là il y a tout ce qu'il y a de dispo sur le treeview et ce que ca fait
    il y a par exemple l'event AfterExpand qui se déclénche donc quand on ouvre un noeud

    il suffit donc de retirer la récursivité de ta méthode, lire le niveau 0 du disque, mettre les nodes
    afterexpand, si tu n'as pas encore les noeuds d'en dessous tu recherches sur le disque

    après gérer niveau n+2 c'est vrai que c'est plus pratique, mais c'est plus chiant à expliquer en détail

    sinon il y a aussi le multithreading
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Tout à fait d'accord avec Pol63, on peut aussi envisager le multithreading Mais c'est une autre paire de manche.

    En attendant, voici déjà un exemple d'optimisation :
    1. On charge le premier niveau
    2. On s'abonne à l'évènement BeforeExpand
    3. On ajoute un nœud fantôme histoire d'afficher le signe + sur tous les dossiers du premier niveau
    4. Lorsqu'on passe dans BeforeExpand, on supprime le nœud fantôme, puis on va charger le premier niveau du dossier en cours
    5. Etc.


    Voici le code :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Me.PopulateTreeView()
     
            ' On s'abonne à l'évènement BeforeExpand du TreeView (on le fait après avoir populé le TreeView)
            AddHandler Me.TreeView1.BeforeExpand, AddressOf Me.TreeView1_BeforeExpand
        End Sub
     
        Private Sub PopulateTreeView()
            Dim rootNode As TreeNode
            Dim info As New DirectoryInfo("C:\")
     
            If info.Exists Then
                rootNode = New TreeNode(info.Name)
                rootNode.Tag = info
                rootNode.Expand()
                GetDirectories(info.GetDirectories(), rootNode)
                TreeView1.Nodes.Add(rootNode)
            End If
        End Sub
     
        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
     
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            For Each subDir In subDirs
                aNode = New TreeNode(subDir.Name, 0, 0)
                aNode.Tag = subDir
                aNode.ImageKey = "folder"
     
                Me.AddFakeNode(aNode)
     
                Try
                    subSubDirs = subDir.GetDirectories()
                Catch e As UnauthorizedAccessException
                    subSubDirs = Nothing
                End Try
     
                If Not subDir.Attributes = (FileAttributes.Hidden Or subDir.Attributes) Then
                    nodeToAddTo.Nodes.Add(aNode)
                End If
            Next subDir
        End Sub
     
        Private Sub AddFakeNode(ByVal nodeToAddTo As TreeNode)
            ' On ajoute le noeud fantome pour afficher le signe +
            nodeToAddTo.Nodes.Insert(0, New TreeNode(String.Empty))
        End Sub
     
        Private Sub RemoveFakeNode(ByVal nodeToRemoveFrom As TreeNode)
            ' On supprime le noeud fantome
            nodeToRemoveFrom.Nodes.RemoveAt(0)
        End Sub
     
        Private Sub TreeView1_BeforeExpand(sender As Object, e As TreeViewCancelEventArgs)
            RemoveFakeNode(e.Node)
     
            ' On charge le premier niveau de dossiers pour le noeud en cours de traitement
            Dim di As New DirectoryInfo(e.Node.FullPath)
            GetDirectories(di.GetDirectories(), e.Node)
        End Sub
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Grace à l'évènement BeforeExpand :

    http://www.dreamincode.net/forums/to...dows-explorer/
    http://www.java2s.com/Tutorial/CShar...irectories.htm
    http://www.codeproject.com/Articles/...ystem-TreeView

    EDIT : arff flute ça m'apprendra à coder en même tps.....


    A+

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Super, merci DotNetMatt, ton code rectifié fonctionne bien (sauf le "Me.PopulateTreeView()" en trop dans le load qui affiche le treeview 2 fois), l'affichage est instantané.
    J'y comprends pas grand chose à ton code mais merci à Pol63 pour le lien, je vais potasser tout ça.

    Pour info j'essaye de faire un "BackUp" pc assez complet pour me motiver à apprendre le VB.

    Juste une question bête pour finir...
    Pensez-vous qu'il est possible, en VB (ou tout autre langage d'ailleurs), suite à l'exécution d'un backup (comme j'essaye de faire) de continuer sur la réinstallation complète d'un pc via une image?

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Bylliboy Voir le message
    Pensez-vous qu'il est possible, en VB (ou tout autre langage d'ailleurs), suite à l'exécution d'un backup (comme j'essaye de faire) de continuer sur la réinstallation complète d'un pc via une image?
    en théorie c'est un peu complexe
    un pc ce n'est pas seulement des fichiers, il y a aussi les secteurs de boots, parfois plusieurs disques
    et après pour réinstaller en général ca se fait au boot de la machine, il faut donc un mini OS capable de démarrer, de recréer des partitions, des systèmes de fichiers (ntfs ou autre) et ensuite remettre tout
    donc je ne pense pas que c'est une bonne idée de se lancer là dedans
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    OK merci Pol63, je me doutais bien aussi mais bon je me disais on sait jamais (..sur un malentendu) .
    Salut à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net] Pb avec les treeview, fan d'algo...
    Par bisounux dans le forum ASP.NET
    Réponses: 1
    Dernier message: 01/02/2006, 16h31
  2. [VB.NET] Chargement dynamique des dlls de l'application
    Par leSeb dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/01/2006, 17h49
  3. [VB.NET] chargement d'un datagrid avec un dataset vide
    Par lucie.houel dans le forum ASP.NET
    Réponses: 4
    Dernier message: 23/01/2006, 11h21
  4. [MFC VC.NET] Chargement dynamique de DLL
    Par vanitom dans le forum MFC
    Réponses: 3
    Dernier message: 26/01/2005, 13h56
  5. [CR.NET]Chargement dynamique d'une image
    Par Moah dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 14/12/2004, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo