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

surfzoid 467 Messages postés vendredi 15 août 2003Date d'inscription 21 avril 2010 Dernière intervention - 17 févr. 2008 à 00:04 - Dernière réponse : surfzoid 467 Messages postés vendredi 15 août 2003Date d'inscription 21 avril 2010 Dernière intervention
- 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!
Afficher la suite 

3 réponses

Répondre au sujet
NHenry 14132 Messages postés vendredi 14 mars 2003Date d'inscription 21 avril 2018 Dernière intervention - 18 févr. 2008 à 09:28
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
surfzoid 467 Messages postés vendredi 15 août 2003Date d'inscription 21 avril 2010 Dernière intervention - 17 févr. 2008 à 00:18
0
Utile
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
Commenter la réponse de surfzoid
surfzoid 467 Messages postés vendredi 15 août 2003Date d'inscription 21 avril 2010 Dernière intervention - 19 févr. 2008 à 15:17
0
Utile
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.
@++
Commenter la réponse de surfzoid

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.