Iteration sur tout les controls d'une form [Résolu]

Signaler
Messages postés
463
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
21 avril 2010
-
Messages postés
463
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
21 avril 2010
-
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!

3 réponses

Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
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
Messages postés
463
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
21 avril 2010

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

OneLevelColl.Clear()

EndSub
Messages postés
463
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
21 avril 2010

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.

Merci encore pour ton investissement.
@++