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 :

[VB2005] Treeview et Checkboxes


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut [VB2005] Treeview et Checkboxes
    Bonjour,

    Je voudrais savoir s'il existe un moyen pour savoir si tous les noeuds frères sont cochés ou s'ils sont tous décochés afin de cocher ou décocher le noeud parent.

    Merci

    Ludo

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Tu voudrais savoir en fait si quand tu coches un noeud parent les objets enfants sont cochés (comme dans les installers d'application par exemple) ou à l'inverse ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    Les 2 en fait. Tu as eu raison de poser cette question ça complète la mienne.

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Voilà j'ai tester et j'ai fais ça:

    1- Un TreeView avec comme propriétés d'activées
    • CheckBoxes = True
    • FullRowSelect = True
    2- Cette méthode de créer "AfterCheck"

    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
    Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
            'On désactive temporairement le TreeView
            CType(sender, TreeView).Enabled = False
            'On enlève l'évènement du checked pour éviter la boucle infinie
            RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            'Si le Noeud coché n'a pas de Noeud Parent ....
            If e.Node.Parent Is Nothing Then
                'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                For Each _Noeud As TreeNode In e.Node.Nodes
                    _Noeud.Checked = e.Node.Checked
                Next
            'Sinon ....
            Else
                'On compte le nombre de noeuds cochées
                Dim NoeudsCoches As Integer = 0
                For Each _Noeud As TreeNode In e.Node.Parent.Nodes
                    If _Noeud.Checked Then
                        NoeudsCoches += 1
                    End If
                Next
                'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ...
                If NoeudsCoches = e.Node.Parent.Nodes.Count Then
                    'On coche le noeud parent
                    e.Node.Parent.Checked = True
                'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ...
                ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then
                    'On décoche le noeud parent
                    e.Node.Parent.Checked = False
                End If
            End If
            'On remet l'évènement du checked sur le TreeView
            AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            'On réactive le TreeView
            CType(sender, TreeView).Enabled = True
        End Sub
    Voilà j'ai testé et cela me paraît satisfaisant. Le seul souci est que si tu va trop vite dans le cochage / décochage il se peut que le noeud parent ne fasse pas l'effet souhaité. Je n'ai pas encore trouvé la solution, j'ai essayé en désactivant le treeview mais ça n'a pas l'air de fonctionner.

    Voilà si tu trouves fais le savoir ça pourrait me servir un jour

    Bon développement

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    Merci beaucoup D4rkTiger !

    Par contre j'ai un nouveau problème car j'ai essayé d'adapter ton code de manière récursive mais je bloque sur l'appel récursif. Si tu as une solution, n'hésite pas...

    Merci

    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
        Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
            'On désactive temporairement le TreeView
            CType(sender, TreeView).Enabled = False
            'On enlève l'évènement du checked pour éviter la boucle infinie
            RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            CocheDecocheNoeud(e)
            'On remet l'évènement du checked sur le TreeView
            AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            'On réactive le TreeView
            CType(sender, TreeView).Enabled = True
        End Sub
     
        Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs)
            'Si le Noeud coché n'a pas de Noeud Parent ....
            'If e.Node.Parent Is Nothing Then
            'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
            For Each _Noeud As TreeNode In e.Node.Nodes
                _Noeud.Checked = e.Node.Checked
            Next
            'Sinon ....
            'Else
            If Not (e.Node.Parent Is Nothing) Then
                'On compte le nombre de noeuds cochées
                Dim NoeudsCoches As Integer = 0
                For Each _Noeud As TreeNode In e.Node.Parent.Nodes
                    If _Noeud.Checked Then
                        NoeudsCoches += 1
                    End If
                Next
                'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ...
                If NoeudsCoches = e.Node.Parent.Nodes.Count Then
                    'On coche le noeud parent
                    e.Node.Parent.Checked = True
                    'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ...
                ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then
                    'On décoche le noeud parent
                    e.Node.Parent.Checked = False
                End If
            End If
            CocheDecocheNoeud(e.Node.Parent.Nodes) <== c'est là que je bloque :( 
        End Sub

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Je ne comprends pas pourquoi tu fais cet appel récursif à la fin de ta procédure (tu crées une boucle infine à faire ça ?)

    C'est ce que tu cherches ou bien tu cherches autre chose ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    en fait avec ton code ça ne fonctionne que pour le noeud racine et ses enfants mais pas pour les enfants des enfants...etc...

    C'est pour ça que j'ai voulu en faire une fonction récursive. Et justement je ne sais pas comment appeler un noeud enfant dans le paramètre de ma fonction récursive.

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Ok je vois mieux le principe. Peux - tu peux me dire le nombre d' "etages" que tu souhaites dans tes noeuds principaux ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    En fait y'a 3 niveaux : la racine, ses enfants, et les enfants des enfants.

    Voici à quoi ça devrait ressembler.


  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Ok maintenant c'est plus clair

    Donc voilà comment tu peux faire dans l'immédiat (je vais réfléchir à un système généraliste == système n'ayant pas de nombre définis de niveaux)

    Note: J'ai repris ton 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
    Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
            'On désactive temporairement le TreeView
            CType(sender, TreeView).Enabled = False
            'On enlève l'évènement du checked pour éviter la boucle infinie
            RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            CocheDecocheNoeud(e)
            'On remet l'évènement du checked sur le TreeView
            AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            'On réactive le TreeView
            CType(sender, TreeView).Enabled = True
        End Sub
     
        Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs)
            'Si le Noeud coché n'a pas de Noeud Parent ....
            If e.Node.Parent Is Nothing Then
                  'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                  For Each _Noeud As TreeNode In e.Node.Nodes
                      _Noeud.Checked = e.Node.Checked
                  Next
            'Sinon si le noeud a des enfants cocher les enfants
            ElseIf e.Node.Nodes.Count > 0 Then
                  'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                  For Each _Noeud As TreeNode In e.Node.Nodes
                      _Noeud.Checked = e.Node.Checked
                  Next
            'Sinon...
            Else
                'On compte le nombre de noeuds cochées
                Dim NoeudsCoches As Integer = 0
                For Each _Noeud As TreeNode In e.Node.Parent.Nodes
                    If _Noeud.Checked Then
                        NoeudsCoches += 1
                    End If
                Next
                'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ...
                If NoeudsCoches = e.Node.Parent.Nodes.Count Then
                    'On coche le noeud parent
                    e.Node.Parent.Checked = True
                    'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ...
                ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then
                    'On décoche le noeud parent
                    e.Node.Parent.Checked = False
                End If
            End If
        End Sub
    Essaye de cette manière (j'ai peut être finalement trouvé la façon itérative en tapant la correction)

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    ARf ! Désolé de te dire ça mais ça ne fonctionne toujours pas. Car si je coche "Genre" seul ses enfants se cochent et pas les enfants de ses enfants. Et pareil si je coche ou décoche tous les enfants des enfants, ça n'a aucune incidence sur la racine.

  12. #12
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Ah pardon j'avais oublié ce détails

    Je la refait

    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
    Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
            'On désactive temporairement le TreeView
            CType(sender, TreeView).Enabled = False
            'On enlève l'évènement du checked pour éviter la boucle infinie
            RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            CocheDecocheNoeud(e)
            'On remet l'évènement du checked sur le TreeView
            AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            'On réactive le TreeView
            CType(sender, TreeView).Enabled = True
        End Sub
     
        Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs)
            'Si le Noeud coché n'a pas de Noeud Parent ....
            If e.Node.Parent Is Nothing Then
                  'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                  For Each _Noeud As TreeNode In e.Node.Nodes
                      _Noeud.Checked = e.Node.Checked
                      'Si ce noeud à des noeuds enfants, les mettre dans le même état que le premier
                      If _Noeud.Nodes.Count > 0
                         For Each _NoeudEnfant As TreeNode In _Noeud.Nodes
                             _NoeudEnfant.Checked = e.Node.Checked
                         Next
                      End If
                  Next              
            'Sinon si le noeud a des enfants cocher les enfants
            ElseIf e.Node.Nodes.Count > 0 Then
                  'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                  For Each _Noeud As TreeNode In e.Node.Nodes
                      _Noeud.Checked = e.Node.Checked
                  Next
            'Sinon...
            Else
                'On compte le nombre de noeuds cochées
                Dim NoeudsCoches As Integer = 0
                For Each _Noeud As TreeNode In e.Node.Parent.Nodes
                    If _Noeud.Checked Then
                        NoeudsCoches += 1
                    End If
                Next
                'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ...
                If NoeudsCoches = e.Node.Parent.Nodes.Count Then
                    'On coche le noeud parent
                    e.Node.Parent.Checked = True
                    'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ...
                ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then
                    'On décoche le noeud parent
                    e.Node.Parent.Checked = False
                End If
            End If
        End Sub

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    Je le fais bosser, de nuit en plus , et il s'excuse C'est le monde à l'envers.

    En tout cas tu y es presque, le fait de cocher ou décocher la racine coche ou décoche bien tout le reste mais si on décoche un enfant ou un enfant d'un enfant ça ne décoche pas la racine. Et si je coche tous les enfants ou tous les enfants des enfants ça ne coche pas la racine. Voilà tu sais tout

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    J'ai testé mon code et chez moi cela fonctionne correctement ?

    Peux tu me dire ce qui ne va pas exactement ?

  15. #15
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Pardon excuse moi j'avais pas vu la première cas e à cocher qui en effet reste cochée.

    (je up la solution)

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    Si je coche tous les enfants (ou les enfants des enfants) ça coche pas la racine "Genre". Idem lorsqu'on décoche.


  17. #17
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    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
    Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
            'On désactive temporairement le TreeView
            CType(sender, TreeView).Enabled = False
            'On enlève l'évènement du checked pour éviter la boucle infinie
            RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            CocheDecocheNoeud(e)
            'On remet l'évènement du checked sur le TreeView
            AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            'On réactive le TreeView
            CType(sender, TreeView).Enabled = True
        End Sub
    
        Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs)
            'Si le Noeud coché n'a pas de Noeud Parent ....
            If e.Node.Parent Is Nothing Then
                'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                For Each _Noeud As TreeNode In e.Node.Nodes
                    _Noeud.Checked = e.Node.Checked
                    'Si ce noeud à des noeuds enfants, les mettre dans le même état que le premier
                    If _Noeud.Nodes.Count > 0 Then
                        For Each _NoeudEnfant As TreeNode In _Noeud.Nodes
                            _NoeudEnfant.Checked = e.Node.Checked
                        Next
                    End If
                Next
                'Sinon si le noeud a des enfants cocher les enfants
            ElseIf e.Node.Nodes.Count > 0 Then
                'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                For Each _Noeud As TreeNode In e.Node.Nodes
                    _Noeud.Checked = e.Node.Checked
                Next
                'Sinon...
            Else
                'On compte le nombre de noeuds cochées
                Dim NoeudsCoches As Integer = 0
                For Each _Noeud As TreeNode In e.Node.Parent.Nodes
                    If _Noeud.Checked Then
                        NoeudsCoches += 1
                    End If
                Next
                'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ...
                If NoeudsCoches = e.Node.Parent.Nodes.Count Then
                    'On coche le noeud parent
                    e.Node.Parent.Checked = True
                    If e.Node.Parent.Parent IsNot Nothing Then
                        'On compte le nombre de noeuds cochées dans le niveau racine
                        NoeudsCoches = 0
                        For Each _Noeud As TreeNode In e.Node.Parent.Parent.Nodes
                            If _Noeud.Checked Then
                                NoeudsCoches += 1
                            End If
                        Next
                        If NoeudsCoches = e.Node.Parent.Parent.Nodes.Count Then
                            'On coche le noeud parent
                            e.Node.Parent.Parent.Checked = True
                        ElseIf NoeudsCoches < e.Node.Parent.Parent.Nodes.Count Then
                            'On décoche le noeud parent
                            e.Node.Parent.Parent.Checked = False
                        End If
                    End If
                    'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ...
                ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then
                    'On décoche le noeud parent
                    e.Node.Parent.Checked = False
                    If e.Node.Parent.Parent IsNot Nothing Then
                        'On compte le nombre de noeuds cochées dans le niveau racine
                        NoeudsCoches = 0
                        For Each _Noeud As TreeNode In e.Node.Parent.Parent.Nodes
                            If _Noeud.Checked Then
                                NoeudsCoches += 1
                            End If
                        Next
                        If NoeudsCoches = e.Node.Parent.Parent.Nodes.Count Then
                            'On coche le noeud parent
                            e.Node.Parent.Parent.Checked = True
                        ElseIf NoeudsCoches < e.Node.Parent.Parent.Nodes.Count Then
                            'On décoche le noeud parent
                            e.Node.Parent.Parent.Checked = False
                        End If
                    End If
                End If
            End If
        End Sub
    Voilà normalement ce code là doit fonctionner

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    Oups !

    Tu vas rire enfin j'espère mais maintenant ça fonctionne en effet en ce qui concerne les enfants des enfants. Si j'en décoche un alors que tout est coché ça décoche bien la racine "Genre". Par contre si tout est coché et que je décoche un noeud enfant, du style "aventure", ça ne décoche pas la racine...

    Pareil si je coche tous les enfants ca ne coche pas la racine.

  19. #19
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    T'inquiètes pas j'en rigoles J'adores les défis

    Tiens voilà j'ai modifié le 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
    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
    Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
            'On désactive temporairement le TreeView
            CType(sender, TreeView).Enabled = False
            'On enlève l'évènement du checked pour éviter la boucle infinie
            RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            CocheDecocheNoeud(e)
            'On remet l'évènement du checked sur le TreeView
            AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
            'On réactive le TreeView
            CType(sender, TreeView).Enabled = True
        End Sub
    
        Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs)
            'Si le Noeud coché n'a pas de Noeud Parent ....
            If e.Node.Parent Is Nothing Then
                'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                For Each _Noeud As TreeNode In e.Node.Nodes
                    _Noeud.Checked = e.Node.Checked
                    'Si ce noeud à des noeuds enfants, les mettre dans le même état que le premier
                    If _Noeud.Nodes.Count > 0 Then
                        For Each _NoeudEnfant As TreeNode In _Noeud.Nodes
                            _NoeudEnfant.Checked = e.Node.Checked
                        Next
                    End If
                Next
                'Sinon si le noeud a des enfants cocher les enfants
            ElseIf e.Node.Nodes.Count > 0 Then
                'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché)
                For Each _Noeud As TreeNode In e.Node.Nodes
                    _Noeud.Checked = e.Node.Checked
                Next
                'On compte le nombre de noeuds cochées
                Dim NoeudsCoches As Integer = 0
                For Each _Noeud As TreeNode In e.Node.Parent.Nodes
                    If _Noeud.Checked Then
                        NoeudsCoches += 1
                    End If
                Next
                'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ...
                If NoeudsCoches = e.Node.Parent.Nodes.Count Then
                    'On coche le noeud parent
                    e.Node.Parent.Checked = True
                    'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ...
                ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then
                    'On décoche le noeud parent
                    e.Node.Parent.Checked = False
                End If
                 'Sinon...
            Else
                'On compte le nombre de noeuds cochées
                Dim NoeudsCoches As Integer = 0
                For Each _Noeud As TreeNode In e.Node.Parent.Nodes
                    If _Noeud.Checked Then
                        NoeudsCoches += 1
                    End If
                Next
                'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ...
                If NoeudsCoches = e.Node.Parent.Nodes.Count Then
                    'On coche le noeud parent
                    e.Node.Parent.Checked = True
                    If e.Node.Parent.Parent IsNot Nothing Then
                        'On compte le nombre de noeuds cochées dans le niveau racine
                        NoeudsCoches = 0
                        For Each _Noeud As TreeNode In e.Node.Parent.Parent.Nodes
                            If _Noeud.Checked Then
                                NoeudsCoches += 1
                            End If
                        Next
                        If NoeudsCoches = e.Node.Parent.Parent.Nodes.Count Then
                            'On coche le noeud parent
                            e.Node.Parent.Parent.Checked = True
                        ElseIf NoeudsCoches < e.Node.Parent.Parent.Nodes.Count Then
                            'On décoche le noeud parent
                            e.Node.Parent.Parent.Checked = False
                        End If
                    End If
                    'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ...
                ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then
                    'On décoche le noeud parent
                    e.Node.Parent.Checked = False
                    If e.Node.Parent.Parent IsNot Nothing Then
                        'On compte le nombre de noeuds cochées dans le niveau racine
                        NoeudsCoches = 0
                        For Each _Noeud As TreeNode In e.Node.Parent.Parent.Nodes
                            If _Noeud.Checked Then
                                NoeudsCoches += 1
                            End If
                        Next
                        If NoeudsCoches = e.Node.Parent.Parent.Nodes.Count Then
                            'On coche le noeud parent
                            e.Node.Parent.Parent.Checked = True
                        ElseIf NoeudsCoches < e.Node.Parent.Parent.Nodes.Count Then
                            'On décoche le noeud parent
                            e.Node.Parent.Parent.Checked = False
                        End If
                    End If
                End If
            End If
        End Sub
    Bon eh bien est ce que je peux te dire que cela est correct ?

    OUI je crois

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 212
    Points : 125
    Points
    125
    Par défaut
    YEEEEEEEEEEEEES !!! T'as réussi !!!

    T'es un as dis-moi ! En tout cas je te remercie beaucoup pour ta patience et pour ton talent. Et même si tu aimes les défis je pense aussi que tu aimes rendre service aux autres. Chapeau !

    @+

    Ludo

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

Discussions similaires

  1. [VBA-Excel] Treeview et Checkboxes
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/02/2007, 17h37
  2. vb.net : treeview avec checkbox
    Par 1coni dans le forum Windows Forms
    Réponses: 11
    Dernier message: 31/05/2006, 13h18
  3. [C#] TreeView avec CheckBox à certain niveaux
    Par Maxsin dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/04/2006, 16h29
  4. TreeView et checkbox
    Par BigBenQ dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/08/2005, 08h27
  5. [C#] TreeView avec CheckBox "indeterminate"
    Par padumeur dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/01/2005, 20h53

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