Il faudrait lire un peu tout ce qu'on trouve entre les tutos, la MSDN, ... pour apprendre à correctement créer ses événements et respecter certains standards 
Pour commencer, le prototype des méthodes abonnées à un événement est standardisé
void (object sender, EventArgs e)
ou bien
void (object sender, MyEventArgs e)
avec MyEventArgs une classe dérivée de EventArgs qui va servir à transmettre des informations si l'événement en a l'utilité.
Dans le cas présent, la classe d'arguments de l'événement serait la suivante
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class NotificationEventArgs : EventArgs
{
private string _name;
private string _text;
public string Name
{
get { return _name; }
}
public string Text
{
get { return _text; }
}
public NotificationEventArgs(string name, string text)
{
_name = name;
_text = text;
}
} |
Ensuite, le code pour déclencher l'événement doit être dans la classe qui déclare l'événement. Généralement avec une méthode protected virtual, afin de donner un accès aux classes dérivées. Afin de respecter les standards, il convient donc de déclarer un délégué conforme aux recommandations. Question de standard encore, le nom des méthodes utilisées pour déclencher un événement est toujours de la forme On<NomDeLEvenement>.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class ApplicationFom
{
public delegate void NotificationHandler(object sender, NotificationEventArgs e);
public event NotificationHandler Notification;
protected virtual void OnNotification(string name, string text)
{
NotificationHandler handler = Notification;
if (handler != null)
{
handler(this, new NotificationEventArgs(name, text));
}
}
} |
A partir du framework 2.0, on peut faire sans déclarer le délégué avec l'utilisation des génériques.
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class ApplicationFom
{
public event EventHandler<NotificationEventArgs> Notification;
protected virtual void OnNotification(string name, string text)
{
EventHandler<NotificationEventArgs> handler = Notification;
if (handler != null)
{
handler(this, new NotificationEventArgs(name, text));
}
}
} |
Pour finir pour déclencher l'événement il suffit d'appeler
OnNotification("name", "text")
Autre remarque, le nom d'une classe ne doit pas commencer par I, sauf s'il s'agit bien de la première lettre du nom de la classe (Imprimante, Individu, ...). Car, question de standard toujours, la lettre I est réservée pour le nom des interfaces (ICloneable, IList, ...).
Partager