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

Signaler
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
-
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
-
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

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
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...
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426
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
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426
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
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
3
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
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
3
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
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
3
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.
Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
426
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
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
3
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