TreeView Checkboxes cocher/décocher des n?uds enfants !
pattex62
Messages postés26Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2013
-
8 août 2008 à 04:52
pattex62
Messages postés26Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 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
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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("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)
pattex62
Messages postés26Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 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 ???