TreeView Checkboxes cocher/décocher des n?uds enfants !

pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 janvier 2013 - 8 août 2008 à 04:52
pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 janvier 2013 - 8 août 2008 à 11:13
Bonjour à tous !



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 




Je rencontre un petit problème de lenteur de traitement lors d’un multi cochage/décochage dans un TreeView !



 




Je suis en Vb.net (2008) et j’utilise dans ma forme un contrôle TreeView (Jusque là pas de problème) mais avec l’option Checkboxes activée.



 




Exemple simple d’utilisation (Ici, 3 nœuds racine, des services, qui contiennent chacun une liste de nom, des nœuds enfants) :


Responsable



            Mr. X



            Mr. Y



            Mr. Z


Employer



            Mr. A



            Mr. B



            Mr. C


Manageur



            Mr. M


Mr. N



 


 




Code (à copier/coller) si vous voulez testez :




        Mon_TreeView.Nodes.Add("A", "Responsable")






        Mon_TreeView.Nodes.Add("B", "Employer")






        Mon_TreeView.Nodes.Add("C", "Manageur")






        Mon_TreeView.Nodes("A").Nodes.Add("Mr.X")






        Mon_TreeView.Nodes("A").Nodes.Add("Mr.Y")






        Mon_TreeView.Nodes("A").Nodes.Add("Mr.Z")






        Mon_TreeView.Nodes("B").Nodes.Add("Mr.A")






        Mon_TreeView.Nodes("B").Nodes.Add("Mr.B")






        Mon_TreeView.Nodes("B").Nodes.Add("Mr.C")






        Mon_TreeView.Nodes("C").Nodes.Add("Mr.M")






        Mon_TreeView.Nodes("C").Nodes.Add("Mr.N")






 





Bref, lorsque que je coche un service Responsable/Employer ou Manageur (Un nœud racine) je désire cocher l’ensemble des personnes appartenant à cette même catégorie (ses nœuds enfants), et biensur inversement le décochage d’un nœud racine doit entrainer le décochage de ses enfants.  



 




La solution, elle est toute simple : Utiliser la fonction ForEach



 






   
Private
Sub Cocher_Decocher(ByVal sender AsObject, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles Mon_TreeView.AfterCheck






       
For
Each node_cocher In e.Node.Nodes






           

'Si on vient de cocher le service :






           

If
e.Node.Checked = TrueThen






               

'Alors on coche aussi tout ses enfants :






                node_cocher.checked = True






           
Else







               
'Inversement, le décochage d'un service entraine le décochage de tout ses enfants :







        
       

node_cocher.checked = False






           
End
If







       
Next







   
End
Sub









 




Ca fonctionne !!! OUI !!!



 




Maintenant amusez vous à cocher puis décocher un même service (par exemple « Employer »)  plusieurs fois et assez vite : BUG !!! Le programme fait n’importe quoi…. On arrive à se retrouver avec l’inverse de l’effet désiré : Un nœud parent coché et des enfants décochés, ou inversement un nœud parent décoché et des enfants cochés !!!



 




Si quelqu’un peut me dire comment résoudre se problème (ou un autre moyen) ??? Merci d’avance

2 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 août 2008 à 08:55
testé sous VB2005 Xpress

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Mon_TreeView.Nodes.Add("A", "Responsable")
Mon_TreeView.Nodes.Add("B", "Employer")
Mon_TreeView.Nodes.Add("C", "Manageur")

Mon_TreeView.Nodes("A").Nodes.Add("Mr.X")
Mon_TreeView.Nodes("A").Nodes.Add("Mr.Y")
Mon_TreeView.Nodes("A").Nodes.Add("Mr.Z")

Mon_TreeView.Nodes("B").Nodes.Add("Mr.A")
Mon_TreeView.Nodes("B").Nodes.Add("Mr.B")
Mon_TreeView.Nodes("B").Nodes.Add("Mr.C")

Mon_TreeView.Nodes("C").Nodes.Add("Mr.M")
Mon_TreeView.Nodes("C").Nodes.Add("Mr.N")
End Sub

Private Sub Cocher_Decocher(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles Mon_TreeView.AfterCheck
For Each oChild As TreeNode In e.Node.Nodes
oChild.Checked = e.Node.Checked
Next
End Sub




pas de soucis particulier
(gaffe, ta variable dans l'iteration For Each n'est pas déclarée)
0
pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 janvier 2013
8 août 2008 à 11:13
Déjà, un grand grand merci d’avoir répondu aussi vite !!!


Mais après avoir teste ta réponse, (copier/coller ton code proposé), cela ne marche toujours pas !!!


Je t’assure, tu verras ! Reprend-le :


Cela fonctionne, certes, mais il faut cliquer lentement…. (Pour les acharnés du clique cela bug)


Maintenant assume toi à faire des "Double-cliques" dans la case à cocher d’un nœud racine (« Employer » par exemple)
>>> Bug !!!  (Du moins cher moi, cela bug), on se retrouve avec l’inverse de l’effet désiré !?!?!?


Je ne sait pas si cela et du à la lenteur d’exécution du « For each » ou bien au treeview lui-même ???
0
Rejoignez-nous