Passer des événements en paramètre [Résolu]

Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
- - Dernière réponse : cs_mathmax
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
- 11 janv. 2007 à 17:51
Bonjour,

j'ai une classe qui doit réagir à un certains nombre d'événements d'un certain type. J'aimerais que l'utilisateur de la classe puisse ajouter lui même ces événements.

Je pensais à une classe comme çà :

    public class Class1
    {
       //liste des événements auquel la classe doit régir
        private List<EventHandler> _Events = new List<EventHandler>();

        public Class1(EventHandler e)
        {
            //au moins un événement dans _Events.
            _Events.Add(e);
        }

       //inscrit "Method" pour chaque événement
        public void ManageEvents()
        {
            foreach (EventHandler e in _Events)
                e + = new EventHandler(Method);
        }

       //traite les événements
        public void Method(object sender, EventArgs e)
        {
        }

        public List<EventHandler> Events
        {
            get { return _Events; }
        }
    }

Mais je rencontre 2 problèmes :

- Le premier à mon avis est insolvable : l'utilisateur ne peux ajouter que des événements qu'il à lui même définit. On ne pourra pas écrire : maClasse.Events.add(button1.Click). Je me trompe ?

- e += new EventHandler(Method); produit une erreur car e est en lecture seule. Savez-vous comment résoudre ce problème ?

merci d'avance,

Mathmax
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
51
3
Merci
Hello,

Pour le 1er problème, je n'ai pas de solution. Par contre, pour le 2ème, il te suffit de remplacer

foreach (EventHandler e in _Events)
   e += new EventHandler(Method);

par

for(
int
i=0;i<_Events.Count;i++)
  _Events[i] += new

EventHandler
(Method);

Amicalement, SharpMao

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 SharpMao
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
3
Merci
Je corrige un léger détail dans mon exemple de code précédent:
<hr />// si je veux que ma classe réagisse à button1.Click
button1.Click += new EventHandler(maClasse.Method);

// si je veux qu'elle réagisse à textBox.LostFocus
textBox.LostFocus += new EventHandler(maClasse.Method);

// etc, etc<hr />
Cela implique bien sûr que la méthode MaClasse.Method soit publique.

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 dgouttegattat
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
0
Merci
j'ai peur de ne pas bien comprendre...

tu veux attacher dynamiquement une méthode à un évènement ?

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
0
Merci
merci SharpMao, ça semble marcher.

Par contre pourquoi ça marche ? Pourquoi le fait de faire un fair plutôt qu'un foreach fait que les élément de ma liste sont aussi en écriture ?

sebmafate, non je ne veux pas attacher dynamiquement une méthode à un évènement. J'ai une classe qui fait certaines actions quand un événement se produit. J'aimerais que ces actions se déclanchent aussi quand il se produit d'autre événements (du même typ) définit par les utilisateurs de la classe. Pour celà je voudrait rajouter à la classe la possibilité de lui ajouter des événements auquel elle réagit. J'éspère avoir été clair.

Mathmax
Commenter la réponse de cs_mathmax
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
0
Merci
Salut,

>Pourquoi le fait de faire un fair plutôt qu'un foreach fait que les élément de ma liste sont aussi en écriture ?

Il faudrait plutôt se demander pourquoi un foreach plutôt qu'un for fait que les éléments de la liste sont seulement en lecture. La réponse est... que les spécifications du langage C# disent qu'il en est ainsi. La variable que l'on manipule dans une boucle foreach est une copie en lecture seule de l'élement courant de la collection.

Pour ce qui est de l'autre question, j'ai l'impression que tu te compliques la vie. Si les utilisateurs de la classe veulent qu'elle réagisse à un évènement donné, il leur suffit d'abonner ta classe à l'évènement en question.
<hr />// si je veux que ma classe réagisse à button1.Click
button1.Click += new EventHandler(Method);

// si je veux qu'elle réagisse à textBox.LostFocus
textBox.LostFocus += new EventHandler(Method);

// etc, etc<hr />
De manière générale, dans le modèle de gestion des évènements (qui correspond à peu près au design pattern Observateur), c'est l'objet qui génère l'évènement qui conserve en interne une liste des méthodes à appeler lorsque l'évènement à déclencher, or il me semble que tu cherches à faire le contraire... à moins que tu aies une bonne raison de maintenir ta propre liste?
Commenter la réponse de dgouttegattat
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
0
Merci
Tu as raison, dans mon cas c'est beaucoup plus simple et plus logique d'appeler les méthodes depuis les  objets qui génère l'événement plutôt que de transmettre les événements à la classe.
Mathmax
Commenter la réponse de cs_mathmax