surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010
-
17 févr. 2008 à 00:04
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010
-
19 févr. 2008 à 15:17
Salut
Je suis face a un probleme de longue date, faire une boucle qui passe par TOUT les controles d'une form, j'en une qui marche bien si tout les control sont au même niveau mais prenons l'exemple d'une form avec 4 TableLayout, dans ces 4 Tables layout 2 boutons et 2 textbox, la boucle ne descent que dans le dernier tablelayout.
la boucle d'origine (copier depuis la doc MSDN et adapté par la suite):
PrivateSub ResetAllControlsBackColor(control As Control)
control.BackColor = SystemColors.Control
control.ForeColor = SystemColors.ControlText
' Recursively call this method for each child control.
Dim childControl As Control
ForEach childControl In control.Controls
Console.Writeline(childControl.Name)
ResetAllControlsBackColor(childControl)
Next childControl
EndSub
En fait c'est comme si il n'y avait qu'une seule "instance" de la boucle et que pendant l'execution de celle ci la valeur de "control" change avec le deuxieme appel!
NHenry
Messages postés15151Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention 4 septembre 2024159 18 févr. 2008 à 09:28
Bonjour
Remarque :
PrivateSub AllChilds()
OneLevelColl.Clear()
ForEach childControl In OneLevelColl
ResetAllControlsBackColor(childControl)
Next childControl
OneLevelColl.Clear()
EndSub
Donc tu vide la collection avant de regarder ce qu'il y a dedans ????
J'aurais proposer un autre code, en utilisant la récursivité :
private sub Traite_Control(byval pControls as Controls)
for each lCtrl as Control in pControls
traite_control(lctrl.controls)
Action(lCtrl) 'là tu fait ce que tu veux avec le controle.
next
end sub
Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 17 févr. 2008 à 00:18
je vais faire du "monologue" mais j'apreci volontier un avis .
Une idée viens de germer, restera a la testé :
Dim OneLevelColl as new collection
PrivateSub ResetAllControlsBackColor(control As Control)
control.BackColor = SystemColors.Control
control.ForeColor = SystemColors.ControlText
' Recursively call this method for each child control.
Dim childControl As Control
ForEach childControl In control.Controls
Console.Writeline(childControl.Name)
OneLevelColl.add(Ctrl,Ctrl.Handle)
Next childControl
AllChilds()
EndSub
PrivateSub AllChilds()
OneLevelColl.Clear()
ForEach childControl In OneLevelColl
ResetAllControlsBackColor(childControl)
Next childControl
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 19 févr. 2008 à 15:17
Tu as raison, j ai ecrit ce post sous linux sans editeur de code et j'ai oublié d'enlever la premiere ligne qui vide la colection.
De plus entre temps je me suis apperçu d'un petit détail "vicieu", ce qui me laisser croire que dans ma boucle d'origine je ne passer pas en revut tout les ctrl, s'était des combo et label d'un ToolStrip, bête comme je suis, je m'était dit que c'était des controle auquel on rajouter just "toolstrip" devant le nom surtout que si on regard la liste des propriéte de "ToolStrip1" il y a bien "controls" (mais tjrs vide semble t il !)
Donc le truc vicieu du toolstrip c'est que tout ses ctrl ne sont pas des ctrl mais des Item de la collection d'item de ce dernier, rarghhhhhhh.
une boucle for each sur toute la collection d'item du toolstrip marche nickel.