Evènement dans une classe distincte mais utiliser dans MainWindow [Résolu]

Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
- - Dernière réponse : moi411
Messages postés
180
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
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
3
Merci
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...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de yann_lo_san
Messages postés
13979
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2019
319
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
13979
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2019
319
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
3
0
Merci
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
Commenter la réponse de moi411
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
3
0
Merci
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
Commenter la réponse de moi411
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
3
0
Merci
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.
Commenter la réponse de moi411
Messages postés
13979
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 novembre 2019
319
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
3
0
Merci
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
Commenter la réponse de moi411