begin process at 2010 02 10 01:53:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Windows

 > 

Autre

 > 

passer des événements en paramètre


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

passer des événements en paramètre

jeudi 11 janvier 2007 à 12:18:06 | passer des événements en paramètre

mathmax

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

jeudi 11 janvier 2007 à 13:02:59 | Re : passer des événements en paramètre

SharpMao

Membre Club
Réponse acceptée !
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] +=
newEventHandler(Method);


Amicalement, SharpMao
jeudi 11 janvier 2007 à 13:24:23 | Re : passer des événements en paramètre

sebmafate

Membre Club Administrateur CodeS-SourceS
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]
jeudi 11 janvier 2007 à 14:54:46 | Re : passer des événements en paramètre

mathmax

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

jeudi 11 janvier 2007 à 16:22:48 | Re : passer des événements en paramètre

dgouttegattat

Membre Club
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.

// 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


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?
jeudi 11 janvier 2007 à 16:46:42 | Re : passer des événements en paramètre

dgouttegattat

Membre Club
Réponse acceptée !
Je corrige un léger détail dans mon exemple de code précédent:

// 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

Cela implique bien sûr que la méthode MaClasse.Method soit publique.
jeudi 11 janvier 2007 à 17:51:41 | Re : passer des événements en paramètre

mathmax

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



Cette discussion est classée dans : public, événements, classe, events, eventhandler


Répondre à ce message

Sujets en rapport avec ce message

L'objet et moi [ par tobleronne ] Bonjour,J'ai fait une classe et j'arrive pas a y acceder dans une autre.Ma classe general.cs : ---------------------------public class general{public NullReferenceException [ par pma3d ] Bonjour,   Je poste ici en ne sachant pas trop où mettre mon problème, puisque même si je développe un service web, cela n'a rien à voir avec la caté classe static dans classe static [ par linx20 ] Voila en gros je veux inclure une classe static ds mon autre classe static : public abstract class MaClasseStatic1{public static MaClasseStatic2 st2;/ [.NET2] acceder a une fonction de Form1 dans une autre classe [ par ChamY ] Bonjour,J'ai une question toute bete je pense, mais qui me pose un ptit probleme.Je dispose d'une forme avec ca class (class form1), j ai egalement un Faire un dispose de mon propre composant [ par fcolo ] Bonjour,j'ai réalisé un composant personnel.Ce composant ne dérive pas de Form.J'ai créer une classe vide pour le faire.Ce composant se connecte à une Problème d'héritage [ par fregolo52 ] Bonjour,Je coince un peu dans mes déclarations.J'ai un objet générique dont dérive mes classe :Cette classe implémente l'interface IXmlSerializablepub Parsing dans un classe générique ??? [ par YOOP ] Bonjour tout le monde,J'ai un soucis concernant une classe générique. (c'est mon premier test avec ce genre de classe).Voici :public class Paramètre   Affichage List dans datagridview. [ par ducker88 ] Bonjour à tous,J'ai un soucis d'affichage d'une liste de classe dans un datagridview.J'ai une classe CArticleFournisseur qui contient une classe artic classe dérivée de ElapsedEventArgs [ par jnc ] Bonjour,je cherche créer une classe dériverant de ElapsedEventArgs(pour pouvoir passer des parametres à une fonction timer)public class MonElapsedEve Récupérer un paramètre d'une classe mère [ par therainbow3 ] Bonjour, J'ai créé une classe mère de cette forme:public class Page    {        protected ArrayList textes;        protected ArrayList images;       


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales