Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Windows > Windows Forms
Windows Forms Forum d'entraide sur le développement Windows Forms & Applications Windows. Avant de poster -> Articles Windows Forms
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/09/2012, 08h58   #1
lolo81
Membre à l'essai
 
Inscription : décembre 2007
Messages : 246
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 246
Points : 22
Points : 22
Par défaut Modifier plusieurs mêmes objets en une action

Bonjour à tous,
dans le but de simplifier mon code je cherche la méthode me permettant d'appliquer une actions à plusieurs objet en même temps sans devoir écrire une ligne de code pour chaque objet.
Actuellement si je veux changer la couleur de police à mes 10 textBox je fais ces 10 lignes:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
this.Txt1.ForeColor = System.Drawing.Color.Black;
this.Txt2.ForeColor = System.Drawing.Color.Black;
this.Txt3.ForeColor = System.Drawing.Color.Black;
this.Txt4.ForeColor = System.Drawing.Color.Black;
this.Txt5.ForeColor = System.Drawing.Color.Black;
this.Txt6.ForeColor = System.Drawing.Color.Black;
this.Txt7.ForeColor = System.Drawing.Color.Black;
this.Txt8.ForeColor = System.Drawing.Color.Black;
this.Txt9.ForeColor = System.Drawing.Color.Black;
this.Txt10.ForeColor = System.Drawing.Color.Black;
J'ai pris cet exemple simple mais c'est valable pour d'autres objets, comment faire pour utiliser le chiffre du nom de l'objet (ex Txt1) dans une boucle?
Merci de votre aide,
bonne journée!!
lolo81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 09h11   #2
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 660
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 660
Points : 2 786
Points : 2 786
Si c'est tout tes textbox qui doivent changer de couleur. Tu peux parcourir la liste des controles de la form et tester si ce sont des TextBox.
ou alors tu peux jouer avec la propriété tag
ou encore faire un List<Control> que tu initialises au début avec les controles necessaires
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 09h45   #3
lolo81
Membre à l'essai
 
Inscription : décembre 2007
Messages : 246
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 246
Points : 22
Points : 22
Bonjour BenoitM,
merci pour cette réponse rapide, l'idée de la liste me plait bien mais peux tu m'en dire plus sur la proprieté "Tag" ou me poster un petit exemple avec la propriété "Tag" histoire de me mettre le pied à l'étrier...
Merci d'avance.
lolo81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 10h23   #4
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 660
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 660
Points : 2 786
Points : 2 786
Tag est une propriété de type string de Control. Donc tous les dérivés de control ont cette propriété.
Tu peux par exemple via le designer y mettre : "ToChangeColor"
et puis faire
Code :
1
2
3
4
5
 
for each Control c in this.Controls
{
if (c.Tag == "ToChangeColor") c.ForeColor = Black
}
L'avantage ce que tu peux le faire via le designer.
Initialiser une List<Control> a l'avantage d'être plus rapide (tu ne parcoureras que les controls necessaire et non tout les controls de la form)
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/09/2012, 12h09   #5
ebastien
Membre confirmé
 
Homme Emmanuel Bastien
Développeur .Net / Delphi
Inscription : juillet 2002
Messages : 108
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Bastien
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Développeur .Net / Delphi

Informations forums :
Inscription : juillet 2002
Messages : 108
Points : 209
Points : 209
Bonjour,
Juste une petite précision, la propriété Tag n'est pas un type string mais Object. On peut donc y assigner n'importe quoi. C'est en mode Design qu'il n'est possible d'y assigner qu'une string...
eb.
ebastien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 12h45   #6
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 660
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 660
Points : 2 786
Points : 2 786
Ah oui autant pour moi
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 14h24   #7
Kropernic
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur / DBA
Inscription : juillet 2006
Messages : 1 930
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur / DBA
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 930
Points : 1 465
Points : 1 465
Histoire d'être complet, voici en utilisant une boucle
(c'est en vb mais tu peux traduire le code ici)

Ici, on change la couleur de fond de TOUTES les TextBox présent sur le formulaire (attention, je crois que si un textbox se trouve dans un autre conteneur (une GroupBox par exemple), elle sera pas prise en compte dans la boucle).
Code :
1
2
3
4
 
For Each ctl as TextBox in Me.Controls.OfType(Of TextBox)
    ctl.BackColor = Color.Black
Next
Ici, on change la couleur d'une série de TextBox bien précises (même remarque quant au conteneur)
Code :
1
2
3
4
 
For i as Integer = 0 to 9
   DirectCast(Me.Controls("Txt" & i.ToString),TextBox).BackColor = Color.Black
Next
(sous réserver de légères de syntaxe car je fais ça de tête pas dans VS)

Comme ça, tu as toutes (y en a sûrement encore d'autres mais disons les plus courantes) les options à ta disposition.
__________________
Kropernic (anciennement Griftou).
Kropernic est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/09/2012, 15h04   #8
lolo81
Membre à l'essai
 
Inscription : décembre 2007
Messages : 246
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 246
Points : 22
Points : 22


Merci à tous pour votre aide je retiens vos méthodes, j'ai abandonné l'idée de faire avec une list d'objet car bien que cela fonctionne pour les couleurs c'est plus compliqué lorsqu'il s'agit de BorderStyle.
Je me penche sur la solution de Kropernic qui est selon moi la plus rapide et la plus simple mais je n'arrive pas à l’implémenter correctement, le compilo me remonte cette erreur:
Erreur 1 Un membre 'System.Windows.Forms.Control.Controls' ne pouvant pas être appelé ne peut pas être utilisé comme une méthode.

Code :
((TextBox)this.Controls("Txt" + i.ToString())).BackColor = Color.Black;
lolo81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 15h23   #9
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 660
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 660
Points : 2 786
Points : 2 786
Code :
((TextBox)this.Controls["Txt" + i.ToString()]).BackColor = Color.Black;
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 15h53   #10
lolo81
Membre à l'essai
 
Inscription : décembre 2007
Messages : 246
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 246
Points : 22
Points : 22
Citation:
Envoyé par BenoitM Voir le message
Code :
((TextBox)this.Controls["Txt" + i.ToString()]).BackColor = Color.Black;
Ok, ça fonctionne avec un textBox, j'ai tenté avec un Label simplement hors de ma boucle mais impossible ?? ce sont pourtant bien 2 objets similaires??

Code :
((Label)this.Controls["Label" + "1"]).ForeColor = System.Drawing.Color.Blue;
La référence d'objet n'est pas définie à une instance d'un objet.
lolo81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 16h00   #11
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 660
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 660
Points : 2 786
Points : 2 786
C'est que "Label1" n'existe pas dans ta form

sinon
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
List<Control> mesControlsAModifier = new List<Control>();
mesControlsAModifier.Add(txtbox1);
mesControlsAModifier.Add(label1);
 
foreach (Control control in mesControlsAModifier)
            {
                if (control is TextBox)
                {
                    ((TextBox)control).BackColor = Color.Black;
                }
                else if (control is Label)
                {
                    ((Label)control).ForeColor = System.Drawing.Color.Blue;
                }
            }
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 16h02   #12
Kropernic
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur / DBA
Inscription : juillet 2006
Messages : 1 930
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur / DBA
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 930
Points : 1 465
Points : 1 465

Ton label se nomme-t-il bien "Label1" ?


Ton label se trouve-t-il bien directement dans l'objet Form ?
En effet, s'il est contenu par un GroupBox ou un Panel par exemple, il se trouve alors dans la collection de contrôles du GroupBox ou du Panel. Par conséquent, en cherchant dans les contrôles du Form, tu obtiens une erreur.
__________________
Kropernic (anciennement Griftou).
Kropernic est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 16h07   #13
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 660
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 660
Points : 2 786
Points : 2 786
si c'est le cas 2 tu as une option tu as
Code :
this.Controls.Find("toto",true);
je te laisse regarder comment ca marche dans la doc
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 16h12   #14
lolo81
Membre à l'essai
 
Inscription : décembre 2007
Messages : 246
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 246
Points : 22
Points : 22
Au moins je ne trahi pas le préfixe du titre "Débutant" !!

Mon Label est bien dans un GroupBox, j'ai modifié ça fonctionne parfaitement !!
Merci pour votre patience et vos explications, j'ai beaucoup appris sur le coup !!!
lolo81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 16h13   #15
Kropernic
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur / DBA
Inscription : juillet 2006
Messages : 1 930
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Analyste / Programmeur / DBA
Secteur : Distribution

Informations forums :
Inscription : juillet 2006
Messages : 1 930
Points : 1 465
Points : 1 465
C'est à ça que sert la communauté !

Après toutes les fois où elle m'est venue en aide, il est normal que j'aide à mon tour
__________________
Kropernic (anciennement Griftou).
Kropernic est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 13h17   #16
lolo81
Membre à l'essai
 
Inscription : décembre 2007
Messages : 246
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 246
Points : 22
Points : 22
Bonjour,
je déterre le sujet car je bloque pour un la même chose mais avec des Bitmap,
es ce possible?
Merci pour vos réponses.

Code :
1
2
3
int PicIndex;
((Bitmap)this.????["Pic" + PicIndex]) = PicDrag;
lolo81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 13h59   #17
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 660
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 660
Points : 2 786
Points : 2 786
le bitmap il est contenu dans quoi?

une pictureBox?
c'est quoi PicDrag?
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 19h21   #18
lolo81
Membre à l'essai
 
Inscription : décembre 2007
Messages : 246
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 246
Points : 22
Points : 22
Citation:
Envoyé par BenoitM Voir le message
le bitmap il est contenu dans quoi?

une pictureBox?
c'est quoi PicDrag?
Bonsoir BenoitM,
ces Bitmap (PicDrag , Pic1, Pic2, Pic3, Pic4, etc..) sont déclarés en global,
ils ne sont pas dans des conteneurs ou autre objet.

Code :
((Bitmap)this.????["Pic" + PicDragIndex.ToString()]) = PicDrag;
En fait dans un drag & drop je récupère une image dans un Bitmap (Picdrag) pour le restaurer par la suite dans Pic1, pic2, .... en fonction d'un index(PicIndex).
Un truc compliqué de débutant quoi ..!!!
lolo81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 10h21   #19
lolo81
Membre à l'essai
 
Inscription : décembre 2007
Messages : 246
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 246
Points : 22
Points : 22
Ce n'est donc pas possible pour les variables ou autres objets que les controls?
lolo81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 09h09   #20
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 660
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 660
Points : 2 786
Points : 2 786
alors il faut creer un Dictionnary<string,bitmap>
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h45.


 
 
 
 
Partenaires

Hébergement Web