Iteration sur tout les controls d'une form

Résolu
surfzoid Messages postés 463 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 21 avril 2010 - 17 févr. 2008 à 00:04
surfzoid Messages postés 463 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 21 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!
A voir également:

3 réponses

NHenry Messages postés 15151 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 septembre 2024 159
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
3
surfzoid Messages postés 463 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 21 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

OneLevelColl.Clear()

EndSub
0
surfzoid Messages postés 463 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 21 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.

Merci encore pour ton investissement.
@++
0
Rejoignez-nous