Evènement dans une classe distincte mais utiliser dans MainWindow

Résolu
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 - 25 avril 2013 à 10:42
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 - 5 mai 2013 à 14:34
Bonjour tout le monde,
J'ai une classe qui crée un clavier avec des boutons (10 boutons).
Le problème est que j'ai besoin d’évènements sur ces boutons.
Je les ajoute dans ma classe ( bouton.Click += etc) mais j'ai besoin de les utiliser en cliquant dessus via la fenêtre MainWindow.
Je ne sais pas comment faire le lien entre la classe et la MainWindow.
Pour accompagner le message:

class
{
...

public void creerClavier(...)
{
foreach(...)
{
...
bouton.click += etc.
}
}
}


MainWindow
{
//Utiliser l'évènement ici!
}

J'espère que vous m'avez compris et merci d'avance!
moi

8 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 avril 2013 à 21:20
Salut,

tu peux créer un event dans ta classe permettant de router les Click vers les objets externes qui s'y abonnent.
Exemple :
Un objet contenant un bouton ajouté à un formulaire quelconque.
Dans le click local, on route l'évènement aux abonnés.

public class Objet
{
    // Un bouton
    private Button _btn1;

    // Event permettant de router le click vers un autre objet qui s'y abonne
    public delegate void RouteClickEventHandler(object sender, EventArgs e);
    public event RouteClickEventHandler RouteClickEvent = null;

    // .Ctor
    public Objet(Form unFormOuAjouterLeBouton)
    {
        // Un bouton de base
        _btn1 = new Button();
        _btn1.Name = "Objet._btn1";
        _btn1.Location = new Point(10,10);
        _btn1.Size = new Size(100,24);
        _btn1.Text = "click me !";
        _btn1.Click += new EventHandler(_btn1_Click); // click local

        // Ajoute le bouton sur un formulaire lambda
        unFormOuAjouterLeBouton.Controls.Add(_btn1);
    }

    // Le click local
    void _btn1_Click(object sender, EventArgs e)
    {
        // Route vers les objets qui s'y sont abonnés
        if (RouteClickEvent != null)
            RouteClickEvent(_btn1, EventArgs.Empty);
    }
};


///////////// Dans MainWindow
public partial class MainWindow : Form
{
    // l'objet contenant les boutons et l'event de routage
    Objet m_obj = null; 

    public MainWindow()
    {
        m_obj = new Objet(this);
        m_obj.RouteClickEvent += new Objet.RouteClickEventHandler(m_obj_RouteClickEvent);
    }

    // Le click routé
    void m_obj_RouteClickEvent(object sender, EventArgs e)
    {
        MessageBox.Show("Dans FormMAin, reception du click de " + (sender as Button).Name);
    }
};



bye...
3
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
26 avril 2013 à 23:58
je voulais avoir l'abonnement à l'évènement click dans ma classe (où je crée le bouton)...

Si l'événement ne sort pas de ta classe, MainWindows ne pourra jamais le voir! Il faut forcément que l'événement soit public et que MainWindows y soit abonnée.

Après que tu t'abonnes au click direct ou que tu passes par un événement perso via le délégué le principe est le même.

Whismeril
3
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
25 avril 2013 à 19:50
Bonjour dans TaClass l'événement doit être public.

Ensuite dans MainWindow, quand tu instancies TaClass, il faut t'abonner à l'événement:

MainWindow 
{ 
     //Utiliser l'évènement ici! 
     TaClass toto = new TaClass();
     toto.evenement += etc...
} 




Whismeril
0
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 3
26 avril 2013 à 22:29
Bonsoir,
Désolé pour le retard je n'ai pas eu beaucoup de temps...
Je vais essayer tout ça et je vous donne des nouvelles!
Merci quand-même...


moi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 3
26 avril 2013 à 23:32
Bon et bien ça marche nickel...
Merci à vous deux, les deux fonctionnent mais je voulais avoir l'abonnement à l'évènement click dans ma classe (où je crée le bouton)...
Bref je vais me former aux délégués parce que c'est vraiment intéressant à connaître!
Bonne nuit.


moi
0
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 3
30 avril 2013 à 17:25
Re,
Ça y est j'ai compris ce que tu veux dire... Et j'ai essayé!
Effectivement ça marche mais j'ai une boucle dans ma classe et à chaque itération je crée un bouton, avec un évènement...
Donc si j'ai bien compris ce que tu fais, je devrais placer la boucle dans le mainwindow. Sinon je n'aurai jamais un évènement sur chaque bouton!

Le but final est de réutiliser la classe alors je veux placer le plus de code possible dans cette dernière.

Voilà je te remercie quand-même d'avoir passé du temps pour moi!
A bientôt.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
30 avril 2013 à 19:16
Bonsoir
Sinon je n'aurai jamais un évènement sur chaque bouton!

Est ce nécessaire?
Si on prend exemple avec le KeyPress, toutes les touches du claviers génèrent le même événement, c'est l'objet sender et l'argument e qui permettent ensuite de savoir quelle combinaison de touche à été appelée.

Dans ta classe, le click sur le bouton peut générer un événement interne, dans lequel tu rassembles les infos qui vont bien et tu génère un événement public unique grace au délégué comme l'a montré yann.

Whismeril
0
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 3
5 mai 2013 à 14:34
Re,
Et bien oui... Mais pour ça j'ai besoin d'une boucle quelque part!
Ici c'est une boucle qui crée le clavier et, à chaque itération, abonne le nouveau bouton à l'évènement click.
Donc que ça soit dans la classe ou non, j'ai forcément besoin à un moment d'abonner mes nouveaux boutons à un évènement (en l'occurence click).

Le truc que je ne savais pas faire c'était d'abonner un controle à un évènement quelque part d'utiliser l'évènement autre part.
Ensuite je voulais laisser ma boucle dans la classe pour ne pas avoir à la retaper à chaque fois.
Mais maintenant c'est bon.

Ensuite le délégué je connaissais plus de nom qu'autre chose; Mais je vais me former, ça peut servir!
A bientôt.

moi
0
Rejoignez-nous