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

IHM Discussion :

maj dynamique d'un treeview


Sujet :

IHM

  1. #1
    Membre actif
    Avatar de GAGNON
    Inscrit en
    Septembre 2003
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 201
    Points : 201
    Points
    201
    Par défaut maj dynamique d'un treeview
    Bonjour,

    voila, j'ai un treeview à 2 niv de noeuds.
    un bouton qui ouvre un form contenant les détails des record présent dans le treeview.

    les records représentent des machines qui peuvent être en service ou non

    Pour celles qui sont HS, une image s'affiche devant le noeud lors de la construction du treeview.

    si j'appelle mon form de détail et que je passe une machine de l'état valide à HS (ou l'inverse) comment puis-je répercuter la modif dans le treeview, sans le fermer et le rouvrir ?

    merci de votre aide
    La pensée n'est qu'un éclair au milieu de la nuit. Mais c'est cet éclair qui est tout.
    Henri Poincaré

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Il faut accéder au noeud (node) et modifier son image (je ne sais pas quelle propriété)


    Quand tu ajoutes, il faut appeler la méthode Add du treeview
    Pour la suppression, delete ou remove (je ne sais plus)

  3. #3
    Membre habitué Avatar de RGShoop
    Homme Profil pro
    Freelance
    Inscrit en
    Août 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 112
    Points : 154
    Points
    154
    Par défaut
    Salut,

    Pour mettre à jour un treeview, ce que je fais c'est que je le rejoue.

    Si HS est une case à cocher, à partir de la procédure évenementielle de ta case, tu lui demandes de rééxecuter le chargement du treeview.

    A+ RGShoop

    L'exemple ci-dessous fonctionne sur ce principe mais avec un bouton qui réactualise le treeview :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Commande61_Click()
    Trw_PDT_Init True, Me.Trw_PDT, Me.ID_PLAN_DE_TEST
    End Sub

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Sub Trw_PDT_Init(ByVal Langue As Boolean, treeview As Control, Id_PDT As Integer)
     
     
     
    Dim Dbs As Database: Set Dbs = CurrentDb
    Dim stSql1, stSql2, stSql3 As String
    Dim Rst1, Rst2, Rst3 As Recordset
    Dim Crit1, Crit2, Crit3 As String
    Dim Key1, Key2, Key3 As String
     
     
    Dim Noeud As Node
     
    treeview.Nodes.Clear
     
    If Langue = True Then
     
                Set Noeud = treeview.Nodes.Add(, , "Vide1", "")
                Set Noeud = treeview.Nodes.Add(, , "AD", "Ajouter un nouveau test à ce plan de tests -{Cliquez ici}-")
                Noeud.image = "NEW"
     
                Set Noeud = treeview.Nodes.Add(, , "Vide2", "")
     
     
                stSql1 = "SELECT Tbl_PlanDeTest___Test.ID_TEST, Tbl_PlanDeTest___Test.Id_Plan_De_Tests, Tbl_PlanDeTest___Test.Id_Procedure, " & _
                "Tbl_PlanDeTest___Test.Id_CodeControle, Tbl_PlanDeTest___Test.Code_Procédure, Tbl_PlanDeTest___Test.Nom_Procédure_F, " & _
                "Tbl_PlanDeTest___Test.Nom_Procédure_E, Tbl_PlanDeTest___Test.Controle_Procédure, Tbl_PlanDeTest___Test.Nom_Code_Contrôle_F, " & _
                "Tbl_PlanDeTest___Test.Nom_Code_Contrôle_E, Tbl_PlanDeTest___Test.txt_CODE_TEST, Tbl_PlanDeTest___Test.txt_Libellé_TEST_VF, " & _
                "Tbl_PlanDeTest___Test.txt_Libellé_TEST_VO, Tbl_PlanDeTest___Test.TestEffectué, Tbl_PlanDeTest___Test.TestApplicationOk, " & _
                "Tbl_PlanDeTest___Test.TestEfficaciteOk, Tbl_PlanDeTest___Test.TestKO, Tbl_PlanDeTest___Test.TestCancel " & _
                "FROM Tbl_PlanDeTest___Test WHERE (((Tbl_PlanDeTest___Test.Id_Plan_De_Tests) = " & Id_PDT & ")) " & _
                "ORDER BY Tbl_PlanDeTest___Test.txt_CODE_TEST;"
     
     
                Set Rst1 = Dbs.OpenRecordset(stSql1, dbOpenDynaset)
     
                If Rst1.RecordCount <> 0 Then
     
                Set Noeud = treeview.Nodes.Add(, , "Vide0", Nz(Rst1.RecordCount & " Tests de définis pour ce plan de tests", "Aucun test de défini"))
                Noeud.Bold = True
                Noeud.BackColor = RGB(255, 200, 0)
                Noeud.ForeColor = RGB(255, 255, 255)
     
                Set Noeud = treeview.Nodes.Add(, , "Vide3", "")
     
                Rst1.MoveFirst
     
                Do Until Rst1.EOF
                    Key1 = "GC" & Rst1!ID_TEST
                    Set Noeud = treeview.Nodes.Add(, , Key1, Rst1!txt_CODE_TEST & " - " & Nz(Rst1![txt_Libellé_TEST_VF], "à traduire : " & Rst1![txt_Libellé_TEST_VO]))
                    Noeud.image = "B1"
                    Noeud.Bold = True
                    Noeud.Expanded = True
                    Noeud.ForeColor = 555
     
                        stSql2 = "SELECT Tbl_PlanDeTest__Detail_Test.ID_Detail_Test, Tbl_PlanDeTest__Detail_Test.ID_TEST, " & _
                        "Tbl_PlanDeTest__Detail_Test.Txt_Code_detail, Tbl_PlanDeTest__Detail_Test.Detail_Description, Tbl_PlanDeTest__Detail_Test.ApplicationOk, " & _
                        "Tbl_PlanDeTest__Detail_Test.EfficaciteOk, Tbl_PlanDeTest__Detail_Test.EtapeKO, Tbl_PlanDeTest__Detail_Test.TechniquesTest, " & _
                        "Tbl_PlanDeTest__Detail_Test.TypologieTest, Tbl_PlanDeTest__Detail_Test.FichierEchantillon, Tbl_PlanDeTest__Detail_Test.Commentaire1, " & _
                        "Tbl_PlanDeTest__Detail_Test.Commentaire2 FROM Tbl_PlanDeTest__Detail_Test " & _
                        "WHERE (((Tbl_PlanDeTest__Detail_Test.ID_TEST) = " & Rst1!ID_TEST & ")) " & _
                        "ORDER BY  len(Tbl_PlanDeTest__Detail_Test.Txt_Code_detail), Tbl_PlanDeTest__Detail_Test.Txt_Code_detail;"
     
                        Set Rst2 = Dbs.OpenRecordset(stSql2, dbOpenDynaset)
     
                            If Rst2.RecordCount <> 0 Then
                            Rst2.MoveFirst
                            Do Until Rst2.EOF
                            Key2 = "CS" & Rst2!ID_Detail_Test
                            Set Noeud = treeview.Nodes.Add(Key1, tvwChild, Key2, Rst2![Txt_Code_detail] & " - " & Rst2!Detail_Description)
                            Noeud.image = "B2"
                            Noeud.Bold = False
                            Noeud.Expanded = True
     
                            Rst2.MoveNext
     
                            Loop
                            End If
                            Set Noeud = treeview.Nodes.Add(Key1, tvwChild, "NE" & Key1, "Ajouter une nouvelle séquence à ce test  -{Cliquez ici}-")
                            Noeud.image = "NEW"
                            Set Noeud = treeview.Nodes.Add(, , "Vide2" & Key1, "")
     
                    Rst1.MoveNext
                Loop
                End If
    End If
     
    End Sub

  4. #4
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Rejouer peut être très long

    Inutile de recharcher un arbre complet pour en modifier juste une branche

  5. #5
    Membre actif
    Avatar de GAGNON
    Inscrit en
    Septembre 2003
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 201
    Points : 201
    Points
    201
    Par défaut
    ok, mais comment faire pour rafraichir un noeud?
    La pensée n'est qu'un éclair au milieu de la nuit. Mais c'est cet éclair qui est tout.
    Henri Poincaré

  6. #6
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Ben tu ajoutes, modifies ou supprimes le noeud en question. Je ne vois pas où est la difficulté

  7. #7
    Membre habitué Avatar de RGShoop
    Homme Profil pro
    Freelance
    Inscrit en
    Août 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 112
    Points : 154
    Points
    154
    Par défaut
    Re Salut,

    Sur les évènements Node_Click, Change, Update.

    A+ RGShoop

  8. #8
    Membre actif
    Avatar de GAGNON
    Inscrit en
    Septembre 2003
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 201
    Points : 201
    Points
    201
    Par défaut
    Ben ... justement dans mon form de détail machine je modifie la valeur VALIDE

    Sur un event genre AfterUpdate ou Close du form détail, je voudrais que la modif du noeud prenne effet. (en "live")

    j'ai fait (sans résultat):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Close()
        Forms!F_TreeviewMACHINE!ctlTree.Refresh
    End Sub
    - faut-il faire un Nodes.clear puis recréer tous les noeuds?
    - faut-il mettre à jour le noeud parent (et comment uniquement lui)
    - une autre solution ?

    tout en pensant qu'au final, on pointe sur le noeud de la machine modifiée!

    La pensée n'est qu'un éclair au milieu de la nuit. Mais c'est cet éclair qui est tout.
    Henri Poincaré

  9. #9
    Membre habitué Avatar de RGShoop
    Homme Profil pro
    Freelance
    Inscrit en
    Août 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 112
    Points : 154
    Points
    154
    Par défaut
    Je persiste dans ton cas il faut rejouer le treeview, en revanche plutôt que tourner en carré, si tu nous envoyais ton code, celui de ton treeview....

    Je pense que nous pourrions rapidement nous mettre d'accord...

    A+ RGShoop

  10. #10
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Je persiste dans ton cas il faut rejouer le treeview
    Et bien pas moi !

  11. #11
    Membre actif
    Avatar de GAGNON
    Inscrit en
    Septembre 2003
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 201
    Points : 201
    Points
    201
    Par défaut
    j'adore le ping-pong, mais ça ne fait pas avancer mon schmilblick

    alors voila le code du form contenant le TV, le reste n'existe presqie pas puisque je cherche la soluce

    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
    Private Sub RemplirTreeview()
     
    Dim strSQL As String
    Dim odb As DAO.Database
    Dim oRstAtelier As DAO.Recordset
    Dim oRstMachine As DAO.Recordset
    Dim ctlTree As Control
     
    strSQL = "SELECT  * FROM T_ATELIER;"
    Set odb = CurrentDb
    Set oRstAtelier = odb.OpenRecordset(strSQL)
    Set ctlTree = Me.ctlTree
     
    ctlTree.Nodes.Clear
     
    While Not oRstAtelier.EOF
        ctlTree.Nodes.Add , , "AT" & oRstAtelier.Fields("IDATELIER"), oRstAtelier.Fields("NOMATELIER"), 1, 2
            Set oRstMachine = odb.OpenRecordset("SELECT  * FROM T_MACHINE WHERE [NOATELIER]=" & oRstAtelier.Fields("IDATELIER") & ";")
            While Not oRstMachine.EOF
                'le IF pour tester si un machine est à l'arret auquel cas => icone
                If oRstMachine.Fields("ACTIVE") = True Then
                    ctlTree.Nodes.Add "AT" & oRstAtelier.Fields("IDATELIER"), tvwChild, "M" & oRstMachine.Fields("IDMACHINE"), oRstMachine.Fields("NOMMACHINE")
                  Else
                    ctlTree.Nodes.Add "AT" & oRstAtelier.Fields("IDATELIER"), tvwChild, "M" & oRstMachine.Fields("IDMACHINE"), oRstMachine.Fields("NOMMACHINE"), 3
                End If
                oRstMachine.MoveNext
            Wend
            oRstMachine.Close
        oRstAtelier.MoveNext
    Wend
     
    oRstAtelier.Close
    odb.Close
     
    End Sub
     
    Private Sub Form_Load()
    RemplirTreeview
    End Sub
    ça c'est la maj que j'essaie de faire lorsque je ferme le form détail
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Close()
        Forms!F_TreeviewMACHINE!ctlTree.Refresh
    End Sub
    Sur le principe, reconstruire le TV qd il n'y a que 10 records pourquoi pas? ça ne devrait pas trop géner l'utilisateur, mais imaginons que le TV contienne l'équivalent de 1000 noeuds ... ça me parait moins bon

    et puis on ne modifie qu'un noeud à la fois, donc on devrait pouvoir rafraichir uniquement le noeud parent, non ? C pas possible ça ?

    La pensée n'est qu'un éclair au milieu de la nuit. Mais c'est cet éclair qui est tout.
    Henri Poincaré

  12. #12
    Membre actif Avatar de zEndymion
    Homme Profil pro
    Responsable des applications
    Inscrit en
    Avril 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des applications
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2006
    Messages : 162
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    Pourquoi pas effacer les Nodes fils du node sélectionné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Dim i As Long
     
        If Not (oCtlTreeGestion.SelectedItem Is Nothing) Then
     
            For i = oCtlTreeGestion.SelectedItem.Child.LastSibling.Index To oCtlTreeGestion.SelectedItem.Child.Index Step -1
                oCtlTreeGestion.oTree.Nodes.Remove i
            Next
        End If
    Puis re-créer les noeuds de ce Nodes en reprenant la partie de ton code ou tu créés les noeuds effacer

    Il faudrait bien sur au préalable stocké dans la propriété Tag du node parent la clé de recherche de ta requête : "IDATELIER"


    @+

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Points : 1 041
    Points
    1 041
    Par défaut
    Bonjour,
    Je suis entièrement d'accord avec tofalu pour 3 raisons

    la première est que dans le cas ou vous avez des miliers d'enregistrement cela prend du temps.
    deuxièmement parce qu'en cas de recréation de l'arborescence il n'aura pas la meme forme que le précédent et il faudra le réouvrir
    .
    et troisièmement parce qu'il suffit de modifier l'image du noeud sélectionné directement sur clic

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If Me.TV_Test.SelectedItem.image = "Affiché" Then
                Me.TV_Test.SelectedItem.image = "Invisible"
                Me.TV_Test.SelectedItem.SelectedImage = "Invisible"
            Else
                Me.TV_Test.SelectedItem.image = "Affiché"
                Me.TV_Test.SelectedItem.SelectedImage = "Affiché"
            End If
    Vous devez donc créerdeux images une lorsque l'équipement est actif et l'autre inactif.

    bonne soirée

  14. #14
    Membre actif
    Avatar de GAGNON
    Inscrit en
    Septembre 2003
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 201
    Points : 201
    Points
    201
    Par défaut
    désolé, malade depuis 1 semaine ...

    je reprends donc:

    Question 1: je pointe sur un noeud, j'ouvre le form détail, je modifie la valeur du HS, je referme: je ne peux pas rafraichir mon noeud sans reconstruire tout le TV ? obligé d'appliquer une méthode proche de celle de cbleas ?
    Question 2: pourquoi dans les codes cités plus haut, je ne peux pas déclarer mon control comme un treeview ?
    ça génère des erreurs de compatibilité de type; il n'y a que ça qui marche:
    ou merci de vos réponses
    La pensée n'est qu'un éclair au milieu de la nuit. Mais c'est cet éclair qui est tout.
    Henri Poincaré

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Points : 1 041
    Points
    1 041
    Par défaut
    Bonjour,

    Je pense que le Treeview est un control de type treeview.
    Ce qui explique que la déclaration est réalisée avec un control

    Bonne journée

  16. #16
    Membre actif
    Avatar de GAGNON
    Inscrit en
    Septembre 2003
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 201
    Points : 201
    Points
    201
    Par défaut
    le petit prb relatif à ça, c'est que du coup, je n'ai pas les propriétés du TV en natif sur le controle...
    C'est galère pour récupérer les valeurs index ou key d'un noeud.

    autre chose, comment placer le focus sur un noeud particulier ?

    merci
    La pensée n'est qu'un éclair au milieu de la nuit. Mais c'est cet éclair qui est tout.
    Henri Poincaré

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Points : 1 041
    Points
    1 041
    Par défaut
    TV_Test.Nodes(Index).Selected = True

  18. #18
    Membre actif
    Avatar de GAGNON
    Inscrit en
    Septembre 2003
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 201
    Points : 201
    Points
    201
    Par défaut
    merci,

    peut-on faire de même à partir du Key ?
    ex: je veux me positionner sur un noeud que je détermine par rapport à ma table source. l'Id du record est contenu dans la propriété Key ...ce serai plus simple
    Dans le meme esprit, je rajoute un noeud et je veux me positionner dessus



    merci encore
    La pensée n'est qu'un éclair au milieu de la nuit. Mais c'est cet éclair qui est tout.
    Henri Poincaré

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Points : 1 041
    Points
    1 041
    Par défaut
    en général je fais avec le key au lieu de l'index ça fonctionne très bien.

    bon journée

  20. #20
    Membre actif Avatar de zEndymion
    Homme Profil pro
    Responsable des applications
    Inscrit en
    Avril 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des applications
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2006
    Messages : 162
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    Pour la déclaration du TreeView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim CtlTV as TreeView
    Set CtlTV = me.MonCtlTV.Object
    Tu auras ainsi toutes les méthodes et propriétés.

    Pour la sélection d'un Noeud : avec l'index c'est mieux, selon une Key, je balaye tous les nodes en recherchant la valeur.

    Voici une petite classe avec quelque function sur les treeViews, tel que la recherche d'une valeur.

    Classe : ClsTreeView
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
     
    Option Compare Database
    Option Explicit
     
    ' API
    Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
     
     
    ' Variables Object
    Dim WithEvents oTreeView As MSComctlLib.TreeView
    Dim lngCursor As Long
     
    ' Variables De Modules
    Dim NbreTotalDeNodeEnfant As Long, NbreCourantDeNodeTraite As Long, IndexFirstNode As Long, IndexCourant As Long
    Dim KeyOfParentsNode As String
     
     
     
    ' Evenement
    Public Event NotifyNodeClick(ByVal Node As MSComctlLib.Node)
    Public Event NotifyNodeCheck(ByVal Node As MSComctlLib.Node)
    Public Event NotifyNodeExpand(ByVal Node As MSComctlLib.Node)
    Public Event NotifyNodeCollapse(ByVal Node As MSComctlLib.Node)
    Public Event NotifyCheckChildOrParentNodeCheck(ByVal Node As MSComctlLib.Node)
     
     
    ' Enumération
    Public Enum enumSearchTreeViewIn
        treeSearchInKey = 0
        treeSearchInText = 1
        treeSearchInTag = 2
    End Enum
     
    Public Enum EnumSearchTreeViewHow
        treeSearchHowExactly = 0
        treeSearchHowPartial = 1
    End Enum
     
    ' Evenement
     
     
     
     
    Public Property Get oTree() As MSComctlLib.TreeView
        Set oTree = oTreeView
    End Property
     
    Public Property Let oTree(ByRef formsTreeview As MSComctlLib.TreeView)
        Set oTreeView = formsTreeview
        lngCursor = formsTreeview.MousePointer
    End Property
     
    Public Function DeleteSelectedNode(Optional SelectNextNode As Boolean = True) As Boolean
     
        Dim lngIndexOfSelectedItem As Long
        Dim oNode As MSComctlLib.Node, oNextNode As MSComctlLib.Node
     
        If oTreeView Is Nothing Then
            DeleteSelectedNode = False
        Else
            If oTreeView.SelectedItem Is Nothing Then
                DeleteSelectedNode = False
            Else
                Set oNode = oTreeView.SelectedItem
                If oNode Is Nothing Then
                    DeleteSelectedNode = False
                Else
                    ' Si sélection du Node suivant
                    If SelectNextNode Then
                        Set oNextNode = oNode.Next
                        If oNextNode Is Nothing Then
                            Set oNextNode = oNode.Previous
                            If Not (oNextNode Is Nothing) Then
                                oNextNode.Selected = True
                                oNextNode.EnsureVisible
                                RaiseEvent NotifyNodeClick(oNextNode)
                            Else
                                RaiseEvent NotifyNodeClick(Nothing)
                            End If
                        Else
                            oNextNode.Selected = True
                            oNextNode.EnsureVisible
                            RaiseEvent NotifyNodeClick(oNextNode)
                        End If
     
                        oTreeView.Nodes.Remove oNode.Index
                        DeleteSelectedNode = True
                    End If
                End If
            End If
        End If
     
    End Function
     
    Public Sub ClearNode()
        If Not (oTree Is Nothing) Then oTree.Nodes.Clear
    End Sub
     
    Public Function CheckNodesChild(ByRef BeginNode As Node, Optional JustOneLevel As Boolean = False)
     
        Dim n As Integer, NodeTmp As Node
     
        On Error GoTo CheckNodesChild_Error
     
        LockTreeView
     
        If BeginNode.Children > 0 Then
            n = BeginNode.Child.Index
            BeginNode.Child.Checked = BeginNode.Checked
            RaiseEvent NotifyCheckChildOrParentNodeCheck(BeginNode.Child)
     
            ' Si tous les niveau
            If BeginNode.Child.Children > 0 And JustOneLevel = False Then CheckNodesChild BeginNode.Child, JustOneLevel
     
            While n <> BeginNode.Child.LastSibling.Index
                Set NodeTmp = oTreeView.Nodes(n).Next
                NodeTmp.Checked = BeginNode.Checked
     
                RaiseEvent NotifyCheckChildOrParentNodeCheck(NodeTmp)
     
     
                n = NodeTmp.Index
                Set NodeTmp = Nothing
            Wend
        End If
     
        UnLockTreeView
     
        Exit Function
    CheckNodesChild_Error:
     
        Select Case Err.Number
        Case Else
            UnLockTreeView
            MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure CheckNodesChild of Module de classe clsTreeView"
        End Select
     
     
    End Function
     
    Public Sub CheckNodesParent(BeginNode As Node, Optional JustOneLevel As Boolean = False)
        Dim MyNode As Node
     
     
        If BeginNode.Parent Is Nothing Then Exit Sub
        Set MyNode = BeginNode
        Do
            Set MyNode = MyNode.Parent
            MyNode.Checked = BeginNode.Checked
            RaiseEvent NotifyCheckChildOrParentNodeCheck(MyNode)
        Loop Until MyNode.Parent Is Nothing
        Set MyNode = Nothing
     
     
    End Sub
     
    Public Function SelectedItem() As Node
        If oTree Is Nothing Then
            Set SelectedItem = Nothing
        Else
            Set SelectedItem = oTree.SelectedItem
        End If
    End Function
     
    Public Function SearchAndSelectNode(StrValSearch As String, _
                                        Optional WhereSearch As enumSearchTreeViewIn = treeSearchInKey, _
                                        Optional HowSearch As EnumSearchTreeViewHow = treeSearchHowExactly) As Boolean
     
        Dim n As Node, StrVal As String, FlagResult As Boolean
     
        On Error GoTo SearchAndSelectNode_Error
     
        LockTreeView
        SearchAndSelectNode = False
     
        For Each n In oTreeView.Nodes
     
            Select Case WhereSearch
            Case 0: StrVal = n.Key     ' In Key
            Case 1: StrVal = Nz(n.Text, "")    ' In Text
            Case 2: StrVal = Nz(n.Tag, "")    ' In Tag
            End Select
     
            FlagResult = False
     
            Select Case HowSearch
            Case treeSearchHowExactly: If StrVal = StrValSearch Then FlagResult = True
            Case treeSearchHowPartial: If StrVal Like "*" & StrValSearch & "*" Then FlagResult = True
            End Select
     
            If FlagResult Then
                n.EnsureVisible
                n.Selected = True
                SearchAndSelectNode = True
                Exit For
            End If
     
        Next
     
        UnLockTreeView
     
     
        Exit Function
    SearchAndSelectNode_Error:
     
        Select Case Err.Number
        Case Else
            UnLockTreeView
            MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure SearchAndSelectNode of Module de classe clsTreeView"
        End Select
     
     
    End Function
     
    Private Sub LockTreeView()
        ' Display the hourglass cursor whilst sorting
        oTreeView.MousePointer = 11
     
        ' Prevent the ListView control from updating on screen - this is to hide
        ' the changes being made to the listitems, and also to speed up the sort
        LockWindowUpdate oTreeView.Hwnd
    End Sub
     
    Private Sub UnLockTreeView()
     
        ' Unlock the list window so that the OCX can update it
        LockWindowUpdate 0&
     
        ' Restore the previous cursor
        oTreeView.MousePointer = lngCursor
     
    End Sub
     
    Public Sub ExpandTreeView()
        Dim i As Long
     
    On Error GoTo ExpandTreeView_Error
     
        If oTree Is Nothing Then Exit Sub
        If oTree.Nodes.Count = 0 Then Exit Sub
     
        Call LockTreeView
     
        For i = 1 To oTree.Nodes.Count
            ' Développe tous les nœuds.
            oTree.Nodes(i).Expanded = True
        Next i
     
        Call UnLockTreeView
     
     
    Exit Sub
    ExpandTreeView_Error:
     
        Select Case Err.Number
            Case Else
                Call UnLockTreeView
                MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure ExpandTreeView of Module de classe clsTreeView"
        End Select
     
     
    End Sub
     
    Public Sub CollapseTreeView()
     
        Dim i As Long
     
        On Error GoTo CollapseTreeView_Error
     
        Call LockTreeView
     
        If oTree Is Nothing Then Exit Sub
        If oTree.Nodes.Count = 0 Then Exit Sub
     
        For i = 1 To oTree.Nodes.Count
            ' resserre tous les nœuds.
            oTree.Nodes(i).Expanded = False
        Next i
     
        Call UnLockTreeView
     
        Exit Sub
    CollapseTreeView_Error:
     
        Select Case Err.Number
        Case Else
            Call UnLockTreeView
            MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure CollapseTreeView of Module de classe clsTreeView"
        End Select
     
     
    End Sub
     
     
    Private Sub Class_Terminate()
        If Not (oTreeView Is Nothing) Then Set oTreeView = Nothing
    End Sub
     
    Private Sub oTreeView_Collapse(ByVal Node As MSComctlLib.Node)
        RaiseEvent NotifyNodeCollapse(Node)
    End Sub
     
    Private Sub oTreeView_Expand(ByVal Node As MSComctlLib.Node)
        RaiseEvent NotifyNodeExpand(Node)
    End Sub
     
    Private Sub oTreeView_NodeCheck(ByVal Node As MSComctlLib.Node)
        RaiseEvent NotifyNodeCheck(Node)
    End Sub
     
    Private Sub oTreeView_NodeClick(ByVal Node As MSComctlLib.Node)
        RaiseEvent NotifyNodeClick(Node)
    End Sub
    Exemple d'utilisation

    Dans l'en-tête du form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim WithEvents oCtlTreeGestion As clsTreeView
    dans l'evt Load :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Set oCtlTreeGestion = New clsTreeView
        oCtlTreeGestion.oTree = Me.CtlTreeGestion.Object

    Il y a peut-être quelque Bug dans la classe, mais il y a des exemples de manipulation de TreeView

    @+

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/06/2012, 15h06
  2. Réponses: 1
    Dernier message: 25/03/2011, 10h03
  3. MAJ dynamique d'un champ d'un form_remote
    Par debutant_linux dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 20/12/2007, 11h37
  4. Création dynamique de contrôle Treeview
    Par supernova dans le forum Access
    Réponses: 1
    Dernier message: 06/06/2006, 13h25
  5. Maj dynamique d'un gestionnaire d'événement
    Par Herode dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/03/2006, 10h15

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