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

  1. #1
    Membre averti 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
    Points : 305
    Points
    305
    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   
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    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
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  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 : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    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?
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  4. #4
    Membre averti 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
    Points : 305
    Points
    305
    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???
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  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 : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    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 ??!!
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  6. #6
    Membre averti 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
    Points : 305
    Points
    305
    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.
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  7. #7
    Membre averti 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
    Points : 305
    Points
    305
    Par défaut
    TreeNodeCollection.Clear Method

    You can use this method to clear the entire collection of tree nodes from a tree view.
    Bon je crois bien que c'Est supposé nettoyer la liste alors...Je ne comprends donc toujours pas d'où vient mon bug!!

    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    Teste un Refresh ou un Validate

    qui sais ?
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  9. #9
    Membre averti 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
    Points : 305
    Points
    305
    Par défaut
    J'ai déjà essayer avec les BeginUpdates, EndUpdates et Update, sans succès, mais pas avec les autres que tu viens de dire...

    Je m'y lance, croisons les doigts...
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  10. #10
    Membre averti 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
    Points : 305
    Points
    305
    Par défaut
    Validate n'existe pas
    Refresh ne change absolument rien à mon bug.

    La seule technique que j'ai trouvé semble être de fermé mon navigateur et de le réouvrir avec la nouelle racine, ce qui détruit le TreeView donc il ne peut pas bugger.

    Par contre, c'est pas chic et à l'écran ça se voit, la form ouvre et ferme rapidement...

    Je suis assez dérouté
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  11. #11
    Membre averti 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
    Points : 305
    Points
    305
    Par défaut
    Bon je sombre dans l'oubli.

    Je vais mettre la discussion , même si elle ne l'est pas vraiment.

    J'ai donc fait comme mentionné plus haut, soit fermé et ouvrir mon formulaire qui contient l'arbre.

    Par contre, je ne comprends pas ce qui causait mon bug.

    salut et merci pour l'aide
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  12. #12
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Le problème vient du fait que tu passes "noeud As TreeNode" byref alors qu'il faut le passer byval.

    Un objet doit être passé byval vu que c'est une référence au nœud.

    Par contre je ne suis pas certain que ce soit normal que le treenode se duplique quand tu le passes en byref. Serais ce un bug ? ^^
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  13. #13
    Membre averti 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
    Points : 305
    Points
    305
    Par défaut
    Citation Envoyé par DelphiManiac Voir le message
    Le problème vient du fait que tu passes "noeud As TreeNode" byref alors qu'il faut le passer byval.

    Un objet doit être passé byval vu que c'est une référence au nœud.
    Ah ben la Bravo! En plein dans le mille!!! J'vais aller bien lire la différence entre ByRef et ByVal car je n'aurais jamais pu trouver ça par moi-même, autre que par des essais au hasard! Merci beaucoup DelphiManiac, et encore bravo!

    Par contre je ne suis pas certain que ce soit normal que le treenode se duplique quand tu le passes en byref. Serais ce un bug ? ^^
    La je peux pas aider, si jamais dans mes lectures je trouve je remets le passage ici...

    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  14. #14
    Membre averti 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
    Points : 305
    Points
    305
    Par défaut
    Faut pas oublier le truc le plus bizarre dans tout ça:

    L'arbre se dupliquait visuellement mais pas dans la collection des noeuds de l'arbre. Il ne contenait qu'un noeud racine. Mais je pouvais toujours travailler avec mon arbre, ie que sur un événement clic je load les fichiers contenus dans le dossier, et autant sur l'original que sur le dupli ça fonctionnait...
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

+ 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