begin process at 2012 02 04 09:14:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > EVENTHANDLERS GÉNÉRIQUES

EVENTHANDLERS GÉNÉRIQUES


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Source .NET ( DotNet ) Classé sous :EventHandler, EventArg, Generic, Event, Delegate Niveau :Initié Date de création :25/04/2009 Vu :4 967

Auteur : ricklekebekoi

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note


 Description

Par le passé, je créais mes propres délégates pour chaque évenement à lancer. Puis, je me suis mis a utiliser EventHandler<T>, mais ça c'est vite avéré pénible, car je devais créer mes propres Class qui dérivaient de EventArgs a chaque fois. J'ai alors trouvé une ressemblance frappante entre mes différentes sous-classes dérivant d'EventArgs. Souvent je n'ai besoin que d'un ou 2 paramètres. J'ai donc créer des classes génériques répondant a environ 90% de mes besoins niveau EventArgs.

Voici les 3 classes avec une classe de démonstration d'utilisation

Source

  • using System;
  • using System.IO;
  • using System.Windows.Forms;
  • using System.Linq;
  • namespace UtilityLib
  • {
  • /// <summary>
  • /// EventArgs avec un param d'un type quelconque (Key)
  • /// </summary>
  • /// <typeparam name="TKey"></typeparam>
  • public class KeyEventArgs<TKey> : EventArgs
  • {
  • private TKey m_Key;
  • public TKey Key { get { return m_Key; } }
  • public KeyEventArgs(TKey key)
  • {
  • m_Key = key;
  • }
  • }
  • /// <summary>
  • /// EventArgs avec un param d'un type quelconque (Key) et un autre param d'un type quelconque (Value)
  • /// </summary>
  • /// <typeparam name="TKey"></typeparam>
  • /// <typeparam name="TValue"></typeparam>
  • public class KeyValueEventArgs<TKey, TValue> : EventArgs
  • {
  • private TKey m_Key;
  • private TValue m_Value;
  • public TKey Key { get { return m_Key; } }
  • public TValue Value { get { return m_Value; } }
  • public KeyValueEventArgs(TKey key, TValue value)
  • {
  • m_Key = key;
  • m_Value = value;
  • }
  • }
  • /// <summary>
  • /// EventArgs avec un param d'un type quelconque (Key) et d'autres params d'un type quelconque (Values)
  • /// </summary>
  • /// <typeparam name="TKey"></typeparam>
  • /// <typeparam name="TValue"></typeparam>
  • public class KeyValuesEventArgs<TKey, TValue> : EventArgs
  • {
  • private TKey m_Key;
  • private TValue[] m_Values;
  • public TKey Key { get { return m_Key; } }
  • public TValue[] Values { get { return m_Values; } }
  • public KeyValuesEventArgs(TKey key, params TValue[] values)
  • {
  • m_Key = key;
  • m_Values = values;
  • }
  • }
  • /*
  • * SIMULATION D'UTILISATION
  • */
  • class ClassSimulation
  • {
  • public event EventHandler<KeyEventArgs<string>> MessagePopped;
  • public event EventHandler<KeyValueEventArgs<Control, bool>> VisibilityChanged;
  • public event EventHandler<KeyValuesEventArgs<StreamWriter, int>> SumRequested;
  • private StreamWriter fi;
  • private Control co;
  • public ClassSimulation()
  • {
  • fi = new StreamWriter("test.txt");
  • Control co = new Button();
  • }
  • public void SimuleChangeVisibility()
  • {
  • if (VisibilityChanged != null)
  • VisibilityChanged(this, new KeyValueEventArgs<Control, bool>(co, co.Visible));
  • }
  • public void SimuleMessageArrived(string s)
  • {
  • if (MessagePopped != null)
  • MessagePopped(this, new KeyEventArgs<string>(s));
  • }
  • public void SimuleAsk2Nbs(int a, int b)
  • {
  • if (SumRequested != null)
  • SumRequested(this, new KeyValuesEventArgs<StreamWriter, int>(fi, a, b));
  • }
  • public void SimuleAsk8Nbs(int a, int b, int c, int d, int e, int f, int g, int h)
  • {
  • if (SumRequested != null)
  • SumRequested(this, new KeyValuesEventArgs<StreamWriter, int>(fi, a, b, c, d, e, f, g, h));
  • }
  • /// <summary>
  • /// The main entry point for the application.
  • /// </summary>
  • [STAThread]
  • static void Main()
  • {
  • ClassSimulation c = new ClassSimulation();
  • c.MessagePopped += new EventHandler<KeyEventArgs<string>>(c_MessagePopped);
  • c.SumRequested += new EventHandler<KeyValuesEventArgs<StreamWriter, int>>(c_SumRequested);
  • c.VisibilityChanged += new EventHandler<KeyValueEventArgs<Control, bool>>(c_VisibilityChanged);
  • //Simulation
  • c.SimuleAsk2Nbs(2, 7);
  • c.SimuleChangeVisibility();
  • c.SimuleMessageArrived("MessageArrived");
  • c.SimuleChangeVisibility();
  • c.SimuleAsk8Nbs(1, 2, 3, 4, 5, 6, 7, 8);
  • }
  • static void c_VisibilityChanged(object sender, KeyValueEventArgs<Control, bool> e)
  • {
  • Console.WriteLine("Visibility of {0} changed to {1}", e.Key, e.Value);
  • }
  • static void c_SumRequested(object sender, KeyValuesEventArgs<StreamWriter, int> e)
  • {
  • string res = String.Format("La somme de tous les nombres donne {0}", e.Values.Sum());
  • Console.WriteLine(res);
  • e.Key.WriteLine(res);
  • }
  • static void c_MessagePopped(object sender, KeyEventArgs<string> e)
  • {
  • Console.WriteLine(e.Key);
  • }
  • }
  • }
using System;
using System.IO;
using System.Windows.Forms;
using System.Linq;

namespace UtilityLib
{
    /// <summary>
    /// EventArgs avec un param d'un type quelconque (Key)
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    public class KeyEventArgs<TKey> : EventArgs
    {
        private TKey m_Key;
        public TKey Key { get { return m_Key; } }

        public KeyEventArgs(TKey key)
        {
            m_Key = key;
        }
    }

    /// <summary>
    /// EventArgs avec un param d'un type quelconque (Key) et un autre param d'un type quelconque (Value)
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TValue"></typeparam>
    public class KeyValueEventArgs<TKey, TValue> : EventArgs
    {
        private TKey m_Key;
        private TValue m_Value;
        public TKey Key { get { return m_Key; } }
        public TValue Value { get { return m_Value; } }

        public KeyValueEventArgs(TKey key, TValue value)
        {
            m_Key = key;
            m_Value = value;
        }
    }

    /// <summary>
    /// EventArgs avec un param d'un type quelconque (Key) et d'autres params d'un type quelconque (Values)
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TValue"></typeparam>
    public class KeyValuesEventArgs<TKey, TValue> : EventArgs
    {
        private TKey m_Key;
        private TValue[] m_Values;
        public TKey Key { get { return m_Key; } }
        public TValue[] Values { get { return m_Values; } }

        public KeyValuesEventArgs(TKey key, params TValue[] values)
        {
            m_Key = key;
            m_Values = values;
        }
    }
    /*
     * SIMULATION D'UTILISATION
     */
    class ClassSimulation
    {
        public event EventHandler<KeyEventArgs<string>> MessagePopped;
        public event EventHandler<KeyValueEventArgs<Control, bool>> VisibilityChanged;
        public event EventHandler<KeyValuesEventArgs<StreamWriter, int>> SumRequested;

        private StreamWriter fi;
        private Control co;

        public ClassSimulation()
        {
            fi = new StreamWriter("test.txt");
            Control co = new Button();
        }

        public void SimuleChangeVisibility()
        {
            if (VisibilityChanged != null)
                VisibilityChanged(this, new KeyValueEventArgs<Control, bool>(co, co.Visible));
        }
        public void SimuleMessageArrived(string s)
        {
            if (MessagePopped != null)
                MessagePopped(this, new KeyEventArgs<string>(s));
        }
        public void SimuleAsk2Nbs(int a, int b)
        {
            if (SumRequested != null)
                SumRequested(this, new KeyValuesEventArgs<StreamWriter, int>(fi, a, b));
        }
        public void SimuleAsk8Nbs(int a, int b, int c, int d, int e, int f, int g, int h)
        {
            if (SumRequested != null)
                SumRequested(this, new KeyValuesEventArgs<StreamWriter, int>(fi, a, b, c, d, e, f, g, h));
        }
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            ClassSimulation c = new ClassSimulation();
            c.MessagePopped += new EventHandler<KeyEventArgs<string>>(c_MessagePopped);
            c.SumRequested += new EventHandler<KeyValuesEventArgs<StreamWriter, int>>(c_SumRequested);
            c.VisibilityChanged += new EventHandler<KeyValueEventArgs<Control, bool>>(c_VisibilityChanged);

            //Simulation
            c.SimuleAsk2Nbs(2, 7);
            c.SimuleChangeVisibility();
            c.SimuleMessageArrived("MessageArrived");
            c.SimuleChangeVisibility();
            c.SimuleAsk8Nbs(1, 2, 3, 4, 5, 6, 7, 8);
        }

        static void c_VisibilityChanged(object sender, KeyValueEventArgs<Control, bool> e)
        {
            Console.WriteLine("Visibility of {0} changed to {1}", e.Key, e.Value);
        }

        static void c_SumRequested(object sender, KeyValuesEventArgs<StreamWriter, int> e)
        {
            string res = String.Format("La somme de tous les nombres donne {0}", e.Values.Sum());
            Console.WriteLine(res);
            e.Key.WriteLine(res);
        }

        static void c_MessagePopped(object sender, KeyEventArgs<string> e)
        {
            Console.WriteLine(e.Key);
        }
    }
}

 Conclusion


KeyEventArgs<TKey> : Un paramètre

KeyValueEventArgs<TKey,TValue> : Deux parametres, de deux types pouvant différés

KeyValuesEventArgs<TKey,TValue> : Un nombre >=2 paramètres, étant tous du même types sauf le premier qui peut différer.


 Sources du même auteur

Source avec Zip Source .NET (Dotnet) ARBRE (TREE) - STRUCTURES D'ARBRES GÉNÉRIQUES
Source .NET (Dotnet) LOGMANAGER: COMMENT "LOGGER" DE MANIÈRE SIMPLE
Source avec Zip Source .NET (Dotnet) [XNA 1.0 REFRESH] GESTION PAR GAMESTATE
Source avec Zip Source avec une capture Source .NET (Dotnet) [.NET 3.5] TICTACTOE WPF
Source avec Zip Source avec une capture Source .NET (Dotnet) GÉNÉRATEUR GRAPHIQUE DE CARTE DE JEU

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) DIFFÉRENTIELLE ENTRE DEUX COLLECTION par morphey_83
Source avec Zip Source avec une capture Source .NET (Dotnet) RICHTEXTBOX POUR COLORATION SYNTAXIQUE EN TEMPS REEL par Renfield
Source avec Zip Source avec une capture Source .NET (Dotnet) TRANSFORMER UN PROGRAMME EN SERVICE par xavh44
Source avec Zip Source .NET (Dotnet) [C# ET T4] TEMPLATE DE VIEW MODEL POUR LE PATTERN MVVM par Kite37
Source .NET (Dotnet) EXEMPLE D'UTILISATION D'UN OCX SANS DECLARATION PREALABLE DA... par yohan49

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) AFFICHAGE DE VALEUR PROVENANT D'U THREAD DANS UN FORMULAIRE par Nyuki
GENERIC NULLABLE TYPE par TheOnlyMaX
Source .NET (Dotnet) [XML] SERIALISER UN DICTIONARY GÉNÉRIQUE par TheOnlyMaX
Source .NET (Dotnet) LOGMANAGER: COMMENT "LOGGER" DE MANIÈRE SIMPLE par ricklekebekoi
Source avec Zip Source avec une capture Source .NET (Dotnet) PASSAGE DE PARAMETRES par Bidou

Commentaires et avis

Commentaire de billou_13 le 27/04/2009 09:39:40

Source intéressante. (manque un p'tit peu de commentaire qd même)

Il est vrai que ça devient vite rébarbatif de créer N événement avec autant de fonctions "delegates" qui vont bien.
Cependant, je reste encore persuader que ce travail est nécessaire, qui plus est si les classes implémentées sont emmenées à devenir une bibliothèque partagée sur Internet ou fournie à d'autres projets.

Commentaire de billou_13 le 27/04/2009 09:42:57 7/10

Si je met pas de notes... (dsl)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

ToolBar et EventHandler... [ par zouzounet ] Bonjour,J'ai créé une toolbar et j'utilise un switch pour accéder aux differents clicks sur un bouton...j'aimerais savoir comment je peux réutiliser u envoyer un event [ par chessandmat ] Bonjour,Je souhaite qu'une methode envoit un evenement. Est-ce possible ?Si oui, comment ?Merci d'avanceCordialementchessandmat debutant: System.EventHandler avec menu dynamique. [ par AppleSeed ] kikoo tous le monde. bon voila mon pb: g crée un menu dynamique, et g besoin de recup les infos de l item sur lequelle g clické, notament son .Text... EventHandler + Controls.Add() = pas bien [ par ricklekebekoi ] J'ai un proubleme !Que se soit un timer, un keyprest ...Tout fonctionne, sauf si je rajoute Controls.Add() pourt un bouton, un picturebox ou nimporte UserControl et Event... [ par bigflo ] Salut à tous...Voila, je voudrais faire mon propre UserControl. Mais j'ai un petit souci vis-àvis des évenements Click et DoubleClick.Je n'arrive pas [C#]Délégué et Event ? [ par mictou ] J'ai une classe "ConnexionBase" qui me permet de me connecter à une base de données pour créer un dataset.J'ai une classe "CtlNavigation" qui est en f EventHandler ?? [ par Fildomen ] Salutje sais comment cr&#233;er plusieurs controles dynamiquement, et je sais aussi leurs attribuer une commande dans l'evenement clique(BTA[ds].Click Problème de thread et event [ par zobio ] Voila, je cherche a lancer un thread secondaire &#224; partir de mon thread principal, jusque la pas de soucis. Ensuite je voudrais que lorsque mon th treeview et problemes de selection [ par nuke_it ] Salut! bon voila mon probleme : j'ai fait un treeview dans lequel j'affiche des donnees style des nom de tables d'une base et des nome de champs assoc problème avec progressbar + begininvoke [ par emmanuel9 ] Bonjour &#224; tous, En faite j'ai un progresseBar qui s'appelle p et la je fais un test car je voudrais qu'on puisse annuler la boucle en appuyant


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,357 sec (4)

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