begin process at 2010 02 10 01:54:24
  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 :2 316

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 une capture Source .NET (Dotnet) AJOUTER DES BYTES À UN EXECUTABLE par t0fx
Source .NET (Dotnet) COPIER/ COLLER DATAGRID (COPY/PASTE) par jamesbidon
Source avec Zip Source .NET (Dotnet) MECANISME DE SYNCHRONISATION DE THREAD - MONITOR, MUTEX, SEM... par jesusonline
Source avec Zip Source .NET (Dotnet) TRAITER UN FOREACH EN PARALLÈLE par maitredede
Source avec Zip Source avec une capture Source .NET (Dotnet) UPLOAD FILE TO FTP SERVER par bensoft2006

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) NOTIFICATIONS DANS UN DELEGATE ASYNCHRONE par olivieram2
Source .NET (Dotnet) LOGMANAGER: COMMENT "LOGGER" DE MANIÈRE SIMPLE par ricklekebekoi
Source avec Zip Source .NET (Dotnet) DBMAP - AUTOGÉNÉRER DES REQUETTES MULTIBASES par Dargos
Source avec Zip Source avec une capture Source .NET (Dotnet) TETRIS.NET par hamed92
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...

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,764 sec (3)

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