C# - Események létrehozása

C# nyelv 18. rész

forráskód letöltése
Mellékelt példában a C# nyelv azon tulajdonságát vizsgáljuk meg, mely lehetővé teszi, hogy egy-egy osztályhoz eseményeket hozzunk létre.
Az alábbiakban nézzük sorra azokat a lépéseket, melyek egy új esemény létrehozásához szükségesek. A mellékelt példában ezeket a Class1.cs tárolja.
Ebben a forráskódban létrehozunk egy olyan osztályt melynek lesz egy MyEvent nevű eseménye. Ez az esemény akkor aktiválódik az egyszerűség kedvéért, mikor meghívásra kerül az OnEvent függvénye az osztálynak.
Első lépésként delegálnunk kell egy függvény típust, melyben megadjuk, hogy a majdan létrehozandó eseményünkhöz, milyen típusú eseménykezelő függvényt kell felhasználni. Ennek a függvénynek két paramétere lesz: az első egy object típusban tárolja annak az osztálynak a példányát, mely aktivizálja az eseményt. Ennek felhasználása ott válik érdemlegessé, amikor több ugyanolyan típusú osztály egy eseményéhez egy, közös eseménykezelő függvényt rendelünk hozzá. Második paraméterként pedig egy int típusú számot adhatunk meg, melyet csak a példa kedvéért hoztunk most létre.
public delegate void MyEventHandler(object sender, int eventcode);  
Következő lépésként deklaráljuk az új osztályt, benne pedig megadunk egy publikus eseményt, melyhez az event kulcsszót kell felhasználnunk. Ezután az esemény típusát adjuk meg, végül annak nevét. Mellékelt példában tehát létrehozunk egy MyEvent nevű és MyEventHandler típusú eseményt.
    public class Class1
    {
      public event MyEventHandler MyEvent;
Ezután létrehozzuk azt a függvényt, melynek meghívása aktivizálja az eseményt is. Itt fontos, hogy az aktivizálás előtt ellenőrizzük, hogy lett-e az eseményhez hozzárendelve eseménykezelő függvény. Ezt úgy ellenőrizhetjük, hogy vizsgáljuk a MyEvent eseményt, hogy értéke nem null-e. Amennyiben van hozzárendelt eseménykezelő függvény, akkor meghívása úgy történik, hogy az esemény nevét írjuk le és paraméterezzük, mintha az egy MyEventHandler típusú függvény lenne. Ennek megfelelően az első paraméter a saját objektum példánya lesz, melyet a this kulcsszóval adhatunk meg, második paraméterként pedig egy véletlenszerű számot adunk vissza 0 és 19 között.
      public void OnEvent() 
      {
        if (MyEvent != null)
        {
          Random r = new Random();
          MyEvent(this, r.Next(20));
        }
      }   
    }
Térjünk most át a Form-hoz tartozó Form1.cs forráskódra, ahol az imént létrehozott Class1 felhasználása található. Ehhez létrehozunk egy példányt belőle első lépésként.
private Class1 c = new Class1();
Ezután a Form-unk konstruktorában hozzárendelünk a Class1 osztály MyEvent eseményéhez egy eseménykezelő függvényt, melyet DoEvent névvel alább hozunk létre. Az függvény hozzárendelése eseményhez a += operátorral történhet az alább látható módon, ahol is a MyEventHandler típusból kell egy példányt létrehozni és paraméterként a DoEvent függvényünket átadni.
        public Form1()
        {
            InitializeComponent();
            c.MyEvent += new MyEventHandler(DoEvent);
        }
Ezek után lássuk a DoEvent eseménykezelő függvényünk elkészítésének módját. Fontos, hogy ennek paraméter listája megegyezzen a kezelni kívánt esemény paramétereivel, amit jelen esetben a MyEventHandler függvény ad meg. Ezek után, hogy függvényünk mit tesz a kapott paraméterrel, az már ránk tartozik. Az egyszerűség kedvéért csak annyit teszünk, hogy kapott eventcode nevű paraméterben lévő számot hozzáadjuk a Form-on lévő ListBox elemeihez.
      protected void DoEvent(object sender, int eventcode)
      {
        listBox1.Items.Add(eventcode.ToString());          
      }
Végül már csak az marad hátra, hogy legyen programunkban egy olyan pont, mely elindítja a MyEvent eseményhez rendelt eseménykezelőt. Ehhez arra van szükségünk, hogy meghívjuk az OnEvent függvényét az osztálynak. Ezt most egy nyomógomb lenyomásához kötjük, így amikor e gombra kattintunk, akkor meghívásra kerül az OnEvent, mely aktivizálja a MyEvent eseményben tárolt függvényt, ami most a DoEvent függvény hívását eredményezi.
      protected void button1_Click (object sender, System.EventArgs e)
      {   
        c.OnEvent();        
      }

C# nyelv cikksorozat