Per generare un evento da una classe C# (anche user o server control), sono necessari i seguenti passi:
  • dichiarare un delegato (delegate) pubblico che rappresenta la firma dell'evento del tipo

    C#

    public delegate void [..nomeEvento..]EventHandler(object source, ..altri parametri..);
    
    dove sender è l'oggetto che ha generato l'evento
  • dichiarare, all'interno della classe, un evento (event) pubblico del tipo definito nel delegato

    C#

    public event [..nomeEvento..]EventHandler [..nomeEventoEsposto..];
    
  • dichiarare un metodo protected che solleva l'evento solo se l'evento è gestito (diverso da null)

    C#

    protected virtual void On[..nomeEventoEsposto..](...altri parametri...)
    {
      if ([..nomeEventoEsposto..] != null)
        [..nomeEventoEsposto..](this, ...altri parametri...);
    }
    
    utile quando si estende la classe e si vuole gestire l'evento in modo diverso
  • sollevare (raise) l'evento quando serve

    C#

    On[..nomeEventoEsposto..](...altri parametri...);
    
Ecco un esempio di una classe che solleva un evento, gestito da un altra classe, ogni volta che il conteggio interno è un multiplo di 10

C#

namespace Sgart
{
  // 1) delegate of event
  public delegate void Mod10EventHandler(object source, int actual);

  public class TestEvent
  {
    // 2)  declare event to expose
    public event Mod10EventHandler Mod10Event;

    // 3) virtual method to raise event
    protected virtual void OnMod10Event(int actual)
    {
      if (Mod10Event != null)
      {
        Mod10Event(this, actual);
      }
    }

    public int InternalCount { get; private set; }

    public TestEvent()
    {
      InternalCount = 0;
    }

    public void UpdateCount()
    {
      InternalCount++;
      if (InternalCount % 10 == 0)
      {
        // 4) raise event
        OnMod10Event(InternalCount);
      }
    }
  }
}
per utilizzarlo:

C#

namespace Sgart
{
  class Program
  {
    static void Main(string[] args)
    {
      //create example class
      TestEvent te = new TestEvent();

      //add event to manage
      te.Mod10Event += new Mod10EventHandler(te_Mod10Event);

      Console.WriteLine("Begin");
      while (te.InternalCount < 25)
      {
        //increase counter ... no otput
        te.UpdateCount();
      }
      Console.WriteLine("End");
    }

    //event raised every 10 count
    static void te_Mod10Event(object sender, int actual)
    {
      Console.WriteLine(string.Format("Actual count: {0}", actual));
    }
  }
}
in pratica incremento il conteggio per 24 volte e come output ottengo:

Text

Begin
Actual count: 10
Actual count: 20
End
Tags:
C#236 Esempi225
Potrebbe interessarti anche: