Passer des événements en paramètre

Résolu
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 11 janv. 2007 à 12:18
cs_mathmax Messages postés 403 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

6 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
11 janv. 2007 à 13:02
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
3
dgouttegattat Messages postés 129 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 30 décembre 2007 3
11 janv. 2007 à 16:46
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.
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
11 janv. 2007 à 13:24
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]
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
11 janv. 2007 à 14:54
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
0

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

Posez votre question
dgouttegattat Messages postés 129 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 30 décembre 2007 3
11 janv. 2007 à 16:22
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?
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
11 janv. 2007 à 17:51
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
0
Rejoignez-nous