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

Windows Forms Discussion :

[vb.net][treeview] Construction d'un Treeview


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut [vb.net][treeview] Construction d'un Treeview
    Rebonjour, j'ouvre un autre poste pour ne pas mélanger les idées.
    J'ai des chaines qui ressemble à ça
    c:\windows
    c:\windows\system32
    c:\windows\system32\truc.txt
    c:\tmp\
    c:\tmp\tmp.tmp
    j'ai une boucle qui lie ligne par ligne et j'arrive séparer les élement dans le but d'en créer un arbre.
    Je voulais savoir comment créer correctement cette arborescence:
    Création d'un Node parent unique C:\
    Création de Node enfant unique Windows & tmp
    ...

    j'ai seulement réussi à faire ça dans une boucle pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TreeView.Nodes.Add(_element(1)) 'c:\ & 
    TreeView.Nodes.Add(_element(2)) 'windows & tmp
    TreeView.Nodes.Add(_element(3)) 'truc.txt & tmp.tmp
    Mais j'ai bien entendu une arborecence à plat et chaque node répété.
    help me please

  2. #2
    Membre expérimenté Avatar de toniolol
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2005
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 281
    Par défaut Re: [vb.net][treeview] Construction d'un Treeview
    Salut,
    je ne suis pas un pro des TreeView...j'en utilise depuis lundi !
    Je me demande si tu ne pourrais pas faire quelque chose avec la propriété FullPath.
    Du genre chercher dans tes noeuds si un FullPath correspond au répertoire de ton fichier à rajouter...c'est un peu brouillon mais je vois la chose de cette manière !

  3. #3
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    ben non, j'ai regardé mais FullPath est readOnly, tu ne peux pas dire que le fullpath d'un node est "c:\tmp\tmp.txt"
    tu peux juste lire la valeur d'un noeud
    merci quand meme

  4. #4
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Marrant je fais un truc un peu similaire (mais plus compliqué ) en ce moment. Ajoute ton premier node parent, ensuite pour les enfants tu fais une boucle. Mais avant d'ajouter un node enfant, parcours ton 'arbre' récursivement depuis le parent du node a ajouter, ensuite le parent du parent et ainsi de suite jusqu'au root node. A chaque fois tu regardes si le node enfant que tu voulais ajouter existe déjà ou non dans l'arborescence. Si oui alors tu arretes la récursion.

  5. #5
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    en fait je n'arrive pas à 2 choses
    1 - Définir qu'un noeud est déja existant afin de ne pas le recreer
    2 - Créer un Noeud enfant du dernier noeud créer

  6. #6
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Je te file mon code en brut. BuildSubTree est en fait appellée dans un boucle pour chaque root node de ton tree.
    chkExists vérifie si le node enfant que tu t'appretes a ajouter, a déjà été ajouté ou non auparavant dans sa hierarchie de nodes parents seulement.
    Je précise que pour comparer deux nodes, j'utilise un QueryID (propre a mon projet) stocké dans .Tag
    Ca devrait t'aider a avancer car.
    Bon courage.

    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
     Public Function chkExists(ByVal n As TreeNode) As Boolean
            m_retval = False
            If Not n Is Nothing Then
                If DirectCast(n.Tag, Query).QueryID = m_curQueryId Then
                    m_retval = True
                ElseIf Not n.Parent Is Nothing Then
                    chkExists(n.Parent)
                End If
            End If
            Return m_retval
        End Function
     
     Public Sub BuildSubTree(ByVal n As TreeNode)
            'get the queries that the current query link to 
            Dim dt As DataTable = GetQueryLinks(CType(n.Tag, Query).QueryID)
            Dim stopLoop As Boolean = False
            If dt.Rows.Count > 0 Then
                For Each row As DataRow In dt.Rows
                    'find that query in m_dtAllQueries to get its name (sortorder ?)
                    Dim r As DataRow = m_dtAllQueries.Rows.Find(row("LinkedQueryId"))
                    'create the query
                    Dim q As New Query(r("QueryName").ToString, CInt(r("QueryId")), CInt(r("SortOrder")))
                    'create the new node and add it
                    Dim n1 As TreeNode = n.Nodes.Add(q.QueryID.ToString)
                    n1.Tag = q
                    RemoveSourceQuery(q)
                    AddAllQueryLinks(q)
                    'find recursively if the current query was referenced before as a parent, then we are running into an infinite loop
                    'the condition for stopping the recursion is met. Just add an extra (...) node for making it user-friendly
                    m_curQueryId = DirectCast(n1.Tag, Query).QueryID
                    If chkExists(n) Then
                        stopLoop = True
                        n1.Nodes.Add("...")
                    End If
                    'carry on the recursion
                    If Not stopLoop Then BuildSubTree(n1)
                    stopLoop = False
                Next
            End If

  7. #7
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    merci je regarde ça

  8. #8
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    petit problème de comprehension :

    si je vais ça, sa ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TreeView.Nodes.Add("C")
                TreeView.Nodes(0).Nodes.Add("Windows")
                TreeView.Nodes(1).Nodes.Add("System32")
                TreeView.Nodes(3).Nodes.Add("fichier.txt")
    si déja manuellement çça marche pas, comment faire en boucle , lol

  9. #9
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TreeView.Nodes.Add("C")
    là tu ajoutes C comme root node

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TreeView.Nodes(0).Nodes.Add("Windows")
    là tu ajoutes Windows en tant que child node de C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     TreeView.Nodes(1).Nodes.Add("System32") 
     TreeView.Nodes(3).Nodes.Add("fichier.txt")
    et là.... tu fais n'importes quoi . Tu essayes d'ajouter des child nodes au root nodes 2 et 4 (l'index commence a 0) et qui donc n'existent meme pas.

    Pour ajouter un child node a Window:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TreeView.Nodes(0).Nodes(0).Nodes.Add("System32")
    Donc utilise la récursivité pour ton besoin.

  10. #10
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    oki ! merci, c'est vraiment la mer..
    moi qui pensait faire un Nodes(i), ça va etre chaud maintenant
    bon vais un passer du temps mes bon, faut que ça marche.
    Sinon a tu penser par passer par un fichier xml, ou dans mon cas, repasser par un dataSet ?

  11. #11
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Citation Envoyé par arnolem
    Sinon a tu penser par passer par un fichier xml, ou dans mon cas, repasser par un dataSet ?
    Pour faire quoi :

  12. #12
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    et au lieu de faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TreeView.Add("_root")
    TreeView.Nodes(0).Nodes.Add("dossier")
    TreeView.Nodes(0).Nodes(0).Nodes.Add("dossier")
    TreeView.Nodes(0).Nodes(0).Nodes(0).Nodes.Add("fichier")
    on peut pas faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TreeView.Add("_root")
    TreeView.PreviewNode.Add("dossier")
    TreeView.PreviewNode.Nodes.Add("dossier")
    TreeView.PreviewNode.Nodes.Add("fichier")
    PreviewNode n'existe pas, c'et moi qui ai mis sa !

  13. #13
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    Citation Envoyé par graphicsxp
    Citation Envoyé par arnolem
    Sinon a tu penser par passer par un fichier xml, ou dans mon cas, repasser par un dataSet ?
    Pour faire quoi :
    ben au lieu de créer ligne par ligne, tu créer un objet qui stocke l'arborescence que tu charge en une ligne.

    Citation Envoyé par neguib
    Je crois qu'en premier lieu, il serait interressant que ce fichier soit un xml qui structure déjà l'arborescence des paths répertoriés ainsi sa gestion par exemple dans l'appli pour un Treeview serait grandement simplifié

  14. #14
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Citation Envoyé par arnolem
    Citation Envoyé par graphicsxp
    Citation Envoyé par arnolem
    Sinon a tu penser par passer par un fichier xml, ou dans mon cas, repasser par un dataSet ?
    Pour faire quoi :
    ben au lieu de créer ligne par ligne, tu créer un objet qui stocke l'arborescence que tu charge en une ligne.

    Citation Envoyé par neguib
    Je crois qu'en premier lieu, il serait interressant que ce fichier soit un xml qui structure déjà l'arborescence des paths répertoriés ainsi sa gestion par exemple dans l'appli pour un Treeview serait grandement simplifié
    Certes pourquoi pas? Mais ce n'est pas compliqué de faire une méthode récursive qui le fait, d'ailleurs je t'ais donné le code.
    D'ou sort cette citation de Neguib, je ne vois aucun post de lui ici

  15. #15
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852

  16. #16
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    bon je suis toujour dessus, je fais un autre truc un peu moin compliqué pour les besoins que j'en ai.
    Peut tu me dire comment vérifier qu'un node existe à partir de son nom
    je le faisait comme ça avec des datacolone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                        If Not (Dt.Columns.Contains(_Col)) Then
                            Dt.Columns.Add(_Col, GetType(String))
                        End If

  17. #17
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Pourquoi ne pas stocker tes noms de répertoires dans le tag des nodes?
    Ensuite tu compares le tag du node courant avec le tag du node le précédent dans la hierarchie (parent) et ainsi de suite jusqu'au root node. Tu fais ca récursivement en utilisant le code que je t'ai donné. Tu remarqueras que je compare deux nodes en utilisant leur tag (mais je vais plus loin car je compare en fait une propriété que j'ai appellé QueryId et qui appartient a l'objet stocké dans le tag. Pour toi le tag sera de type String tout simplement.

  18. #18
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Recherche avancée sur le forum

    tu veux parler de çà http://www.developpez.net/forums/viewtopic.php?t=418119&highlight=treenode

  19. #19
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Citation Envoyé par neguib
    Recherche avancée sur le forum

    tu veux parler de çà http://www.developpez.net/forums/viewtopic.php?t=418119&highlight=treenode
    héhé, Neguib l'oeuil de Lynx.
    [EDIT]
    Heu, par contre la c'est une recherche dans les nodes enfants. Ce qu'il veut ici c'est une recherche récursive dans les parents du node enfant, donc l'inverse.

    Plus un truc de ce genre donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private m_retval as boolean
    Private m_name as String
     
    Public Function chkExists(ByVal n As TreeNode) As Boolean 
            m_retval = False 
            If Not n Is Nothing Then 
                If n.Text.Equals(m_name) Then 
                    m_retval = True 
                ElseIf Not n.Parent Is Nothing Then 
                    chkExists(n.Parent) 
                End If 
            End If 
           Return m_retval 
    End Function

  20. #20
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 852
    Par défaut
    merci, ça marche nikel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       tv.Nodes.Add(_server)
            Dim n As TreeNode
            For Each _row As DataRow In Dt.Rows
                Dim tn As TreeNode = Me.GetNodeByName(Me.tv.Nodes, _row("Partage").ToString)
                If Not (tn Is Nothing) Then
                Else
                    tv.Nodes(0).Nodes.Add(_row("Partage").ToString)
                End If
            Next

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/04/2010, 13h57
  2. [C#][.net 2.0] TreeNode aand Treeview
    Par lenoil dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/11/2008, 09h24
  3. [VB.NET] Trouver noeud dans un TreeView
    Par PM_calou dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/10/2006, 17h42
  4. [VB.NET] Selectionner un noeud du treeview par le code
    Par Elbarto dans le forum Windows Forms
    Réponses: 7
    Dernier message: 23/02/2006, 10h49
  5. [vb.net][treeview] Possibilités d'un Treeview
    Par arnolem dans le forum Windows Forms
    Réponses: 9
    Dernier message: 09/02/2006, 16h02

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