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 :

Sub récursif - double affichage


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut Sub récursif - double affichage
    Bon vendredi à tous!

    J'ai cette sub récursive qui cherche tous les sous-dossiers à partir d'une racine passée en paramètre et affiche tous les sous-dossiers dans un TreeView:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub LoadSubTree(ByRef noeud As TreeNode, ByVal chemin As String)
            For Each dossier In Directory.GetDirectories(chemin)
                noeud.Nodes.Add(Replace(dossier, chemin & "\", ""))
            Next
            For Each tn As TreeNode In noeud.Nodes
                LoadSubTree(tn, tn.FullPath)
            Next
        End Sub
    À l'aide d'un bouton, je lances la routine comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Public Sub LoadNewTree()
            Dim FolderBrowserDialog1 As New FolderBrowserDialog
            FolderBrowserDialog1.ShowNewFolderButton = False
            FolderBrowserDialog1.ShowDialog()
            If FolderBrowserDialog1.SelectedPath <> "" Then
                'Clear ou Remove donne le même résultat
                'Explo_win.TreeView.Nodes.Clear()
                Explo_win.TreeView.Nodes.RemoveAt(0)
                Explo_win.TreeView.Nodes.Add(FolderBrowserDialog1.SelectedPath)
                LoadSubTree(Explo_win.TreeView.Nodes(0), FolderBrowserDialog1.SelectedPath)
                Explo_win.TreeView.SelectedNode = Explo_win.TreeView.Nodes(0)
            End If
            Explo_win.TreeView.ExpandAll()
        End Sub
    Le problème est qu'à la fin de l'exécution, mon TreeView contient 2 fois la même racine et tout ses sous-dossiers. J'ai beau faire du "step-by-step" mais je ne comprends pas comment il fait pour afficher une 2e fois la racine. De plus, à la fin de l'exécution, j'ai vérifié le TreeView.Nodes.Count et il est égal à 1. Donc le TreeView ne voit qu'un noeud, mais il y en a 2 d'afficher (voir load.jpg)


    J'utilise la même fonction à l'ouverture pour ouvrir le dossier de base, sans problème.
    (voir ouverture.jpg)
    Images attachées Images attachées   

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Explo_win.TreeView.Nodes.Clear()
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Explo_win.TreeView.Nodes.RemoveAt(0)
    non?


    Edit : Avait pas lu le commentaire

  3. #3
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut
    Salut,

    Quelle valeur a le paramètre "chemin" au moment du premier appel de LoadSubTree(...) ? ou mieux que te donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Replace(dossier, chemin & "\", "")
    la 1ere fois?

  4. #4
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Citation Envoyé par tigunn Voir le message
    Salut,

    Quelle valeur a le paramètre "chemin" au moment du premier appel de LoadSubTree(...) ? ou mieux que te donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Replace(dossier, chemin & "\", "")
    la 1ere fois?
    La première fois, chemin à la valeur de mon chemin de base et le Replace donne bel et bien le nom de mon premier dossier parcouru (le Replace sert à afficher que le nom du dossier sur les noeuds de l'arbre et non leur chemin complet depuis le c:\)

    J'ai fait le test au lancement de mon programme et suite à un changement de racine, en utilisant le même noeuds de base, et dans les deux cas c'est le même résultat pour le Replace.

    -------

    Aujourd'hui j'ai essayé aussi de faire du Step-by-Step en affichant un msgbox entre chaque ajout de noeud. J'ai remarqué que mes noeuds s'affichent correctement jusqu'à la dernière itération, à ce moment précis il rajoute un copier/coller de tous les noeuds qu'il vient de créer.

    J'ai aussi remarqué que si je refais l'opération plusieurs fois à la suite, le dernier noeud est toujours gardé en mémoire dans l'arbre. Donc après 5 essais, j'avais 5 fois la même racine.

    Donc, je me demande, est-ce que j'aurais mal compris le but de la fonction clear()?

    Sinon, autres tentatives???

  5. #5
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut
    D'après msdn:
    La méthode Clear vide la collection et réinitialise sa propriété Count à 0.
    &&
    RemoveAt(index) Supprime Activity dans ICollection au niveau de l'index spécifié.
    A mon avis clear() semble plus indiqué, mais a moins de faire appel plusieurs fois dans ton code a LoadNewTree(), je vois pa sen quoi cela pourrait jouer ??!!

  6. #6
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Ouais j'ai lu la même chose, je me disais que le RemoveAt(0) devais nécessairement supprimer que le noeud 0, mais les autres noeuds qui restent dans le TreeView après le changement de racine n'appartiennent PAS au treeview.

    J'ai créer un simple bouton qui faire le TreeView.Clear(), et il ne supprime que le premier noeud en haut de la liste. D'où l'exemple que j'avais inclus en pièce jointe initialement, qui indiquait le nombre de noeuds dans la liste, et peut importe l'affichage il n'en comptait qu'un seul!!!

    Donc les noeuds qui sont affichés une deuxième fois ne sont là qu'en affichage, et non dans la liste de l'arbre.

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

Discussions similaires

  1. Double affichage OpenGL dans une meme fenetre
    Par greghass dans le forum OpenGL
    Réponses: 3
    Dernier message: 13/11/2006, 21h57
  2. Réponses: 1
    Dernier message: 13/11/2006, 18h37
  3. [PHP-JS] Pb de double affichage
    Par cell dans le forum Langage
    Réponses: 8
    Dernier message: 23/08/2006, 14h10
  4. [JFrame] double affichage puis x3..
    Par meda dans le forum Agents de placement/Fenêtres
    Réponses: 15
    Dernier message: 20/06/2006, 17h29
  5. [Tableaux] probleme de double affichage
    Par clovis200 dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2006, 16h54

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