Sollevare un evento all'interno di una classe C#
Per generare un evento da una classe C# (anche user o server control), sono necessari i seguenti passi:
per utilizzarlo:
in pratica incremento il conteggio per 24 volte e come output ottengo:
- dichiarare un delegato (delegate) pubblico che rappresenta la firma dell'evento del tipo
dove sender è l'oggetto che ha generato l'eventoC#
public delegate void [..nomeEvento..]EventHandler(object source, ..altri parametri..);
- 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)
utile quando si estende la classe e si vuole gestire l'evento in modo diversoC#
protected virtual void On[..nomeEventoEsposto..](...altri parametri...) { if ([..nomeEventoEsposto..] != null) [..nomeEventoEsposto..](this, ...altri parametri...); }
- sollevare (raise) l'evento quando serve
C#
On[..nomeEventoEsposto..](...altri parametri...);
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);
}
}
}
}
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));
}
}
}
Text
Begin
Actual count: 10
Actual count: 20
End