(c#) Problème gestion d'évents de control ajoutés "en live"

Signaler
Messages postés
6
Date d'inscription
lundi 15 décembre 2003
Statut
Membre
Dernière intervention
3 septembre 2004
-
Messages postés
6
Date d'inscription
lundi 15 décembre 2003
Statut
Membre
Dernière intervention
3 septembre 2004
-
Bonjour à tous et à toutes.

Je suis entrain de développer une application en c#, dans laquelle j'ajoute des contrôles (labels et boutons) "en live" (plus précisément, un click sur un bouton ajoute automatiquement 2 labels et 2 boutons). Le truc, c'est que je ne voie absolument pas le moyen de gérer l'événement "onClick" de ces 2 boutons.

Est-ce quelqu'un aurait une piste?
Merci de votre coopération :)

9 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
par exemple a la generation de chaque bouton tu peux faire :
button.Click += new EventHandler(buttonsLive_Click);


ainsi tu associe les events de tous tes boutons dynamiques à la même methode, a toi de les differencier dans celle ci

private void buttonsLive_Click(object sender, System.EventArgs e)
{
// récupération du bouton ayant declencher l'event
Button button = (Button)sender;

// code de gestion des clics sur les boutons "live" ;)
}


Cocoricoooooooo !!!!
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Voila un bout de code te montrant ce que tu demandes

    
    private void Form1_Load(object sender, EventArgs e)
        {
            Button btn = new Button() ;
            btn.Location = new System.Drawing.Point(20, 20);
            btn.Name = "btn";
            btn.Size = new System.Drawing.Size(200, 25);
            btn.Text = "The button";
            btn.Click += new System.EventHandler(btn_Click);

            this.Controls.Add(btn);
        }

        private void btn_Click(object sender, EventArgs e)
        {
            MessageBox.Show("bouton cliqué");
        }


La ligne qu'il faut retenir est :

btn.Click += new System.EventHandler(btn_Click);

@+

Cyril
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
dsl coq, j'avais pas vu ton post :)

Cyril
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
lol pas grave, au contraire, d'habitude c'est moi qui me fait avoir ^^
mieux vaut 2 exemples que rien du tout :)

Cocoricoooooooo !!!!
Messages postés
6
Date d'inscription
lundi 15 décembre 2003
Statut
Membre
Dernière intervention
3 septembre 2004

Plop :)

Merci les gars pour vos coups de main, ça marche nickel.

Par contre, maintenant, autre problème :D (désolé)

Je ne voie pas du tout comment accéder à mes labels crées "en live" par ces boutons. J'ai bien essayé en bouclant sur tous les contrôles ajoutés en live dans ma groupBox, et je fais un test en fonction du nom du bouton cliqué, mais ça me plait pas (et ça me ferait peur si la groupBox se voit dotée d'une centaine de contrôles :p).
Y'a-t-il un moyen d'accéder au labels par pointeur comme en c++ ou par référence?
Mais alors là, je vois pas comment (mais alors absolument pas);

Merci de votre coopération
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
je pense que dans ce cas tu peux utiliser la propriété Tag de la classe Button (héritée de Control) : on y met ce qu'on veut (object)

donc mon idée :
quand tu crées tes controles (button et label) "live", tu les ajoutes dans un ArrayList (System.Collections) que tu affectes ensuite à la propriété Tag du bouton ayant lancer la création des controles.

et quand tu veux recuperer cette fameuse liste tu fais
ArrayList liste = (ArrayList)buttonClique.Tag;


comme ça tu ne parcouras plus que la liste associée à un bouton au lieu de l'ensemble des controles contenus par ton grpbox

exemple de code pour differencier Label/Button :
object controle = liste[0];
if ( controle.GetType() == typeof(Button) )
{
// c'est un bouton
}
else if ( controle.GetType() == typeof(Label) )
{
// c'est un Label
}
...


remarque arrivé ici je ne suis plus sur d'avoir saisi le probleme %-6

Cocoricoooooooo !!!!
Messages postés
6
Date d'inscription
lundi 15 décembre 2003
Statut
Membre
Dernière intervention
3 septembre 2004

Ben en gros, quand tu places un contrôles"à la main sur la form", tu peux ensuite faire :
monContrôle.méthode() ....


Moi j'ajoute mes contrôles en live, après, dans une autre fonction, je ne peux pas faire la même chose (même si syntaxiquement ça passe, l'edi m'envoie une erreur comme quoi mon objet n'est pas lié à une référence d'objet (ou un truc dans le genre) :p)

Voilà, si ça peut aider à bien situer le problème ;)
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
87
euh ba là pas de prob

object controle = liste[0];
if ( controle.GetType() == typeof(Button) )
{
// c'est un bouton
Button bouton = (Button)controle;
bouton.PerformClick(); // bon ok aucun interet mais j'avais pas d'autre idée ^^
}
else if ( controle.GetType() == typeof(Label) )
{
// c'est un Label
Label label = (Label)controle;
label.Text = "Cool";
}


Cocoricoooooooo !!!!
Messages postés
6
Date d'inscription
lundi 15 décembre 2003
Statut
Membre
Dernière intervention
3 septembre 2004

Ok, merci, je voyais pas les choses comme ça, mais bon, si ça marche ;)
Bon, faut que je m'absente :p Je verrais ça en rentrant.
Merci beaucoup du coup de main.