Introduction aux Delegates et les événements en .Net Partie2

1) Définition des événements

Un événement en C# est un moyen pour une classe de fournir des notifications aux clients de cette classe lorsque il y a un changement.
L’utilisation la plus familière des événements dans les interfaces graphiques, généralement les  classes qui contiennent des contrôles dans leurs interfaces ont des événements qui sont déclenchés par l’utilisateur  lorsque il fait une action sur l’interface (exemple cliquer sur un bouton).
Les événements peuvent être utilisés aussi  pour signaler le changement d’état d’un objet.

2) Déclaration des événements

Les événements sont déclarés  en utilisant un Type délégué (petit rappel : un type délégué permet de référencer une méthode d’une classe). 

Prenons l’exemple suivant :

public event EventHandler  NumberReached;

L’événement de type EventHandler prend deux paramètres :

-          sender : de type Object (Source de l’événement).

-          e : de type EventArgs (Objet qui ne contient aucune donnée d’événement).  

3) Exemple

L'exemple suivant montre un événement nommé NumberReached qui est associé à un délégué de ReachedEventHandler. La méthode assignée au délégué de ReachedEventHandler est appelée dans la méthode OnNumberReached.

namespace TestEvenement

{

class Program

{

static void Main(string[] args)

{

Counter c = new Counter(new Random().Next(10));

c.NumberReached += c_NumberReached;

Console.WriteLine("press 'a' key to increase total");

while (Console.ReadKey(true).KeyChar == 'a')

{

Console.WriteLine("adding one");

c.Add(1);

}

}

static void c_NumberReached(object sender, NumberReachedEventArgs e)

{

Console.WriteLine("The threshold of {0} was reached at {1}.", e.NumberReached, e.TimeReached);

Environment.Exit(0);

}

}

public class Counter

{

public delegate void ReachedEventHandler(object sender, NumberReachedEventArgs e);

public event ReachedEventHandler NumberReached;

private int number;

private int total;

public Counter(int passedNumber)

{

number = passedNumber;

}

public void Add(int x)

{

total += x;

if (total >= number)

{

var args = new NumberReachedEventArgs { NumberReached = number, TimeReached = DateTime.Now };

OnThresholdReached(args);

}

}

protected virtual void OnThresholdReached(NumberReachedEventArgs e)

{

ReachedEventHandler handler = NumberReached;

if (handler != null)

{

handler(this, e);

}

}

}

public class NumberReachedEventArgs : EventArgs

{

public int NumberReached { get; set; }

public DateTime TimeReached { get; set; }

}

Remarque :

Pour déclarer un événement dans une classe il faut déclarer d’abord son type délégué:  

public delegate void ReachedEventHandler(object sender, NumberReachedEventArgs e);

Le type délégué défini la liste des arguments qu’il faut passer à la méthode qui exécute l’événement.

Après il faut déclarer l’événement :

public event ReachedEventHandler NumberReached;

Appel d’un événement : Une fois la classe a déclaré un événement, il peut traiter cet événement comme un champ de type délégué indiqué. Le champ sera soit null, si aucun client n’a accroché un délégué à l’événement, ou bien il se réfère à un délégué qui doit être appelé lorsque l’événement est appelé.

ReachedEventHandler handler = NumberReached;

if (handler != null)

{

    handler(this, e);

}

Attachement d’un événement : L’attachement est possible de l’extérieur de la classe qui l’a déclaré, un événement ressemble à un champ de la classe avec un accès très limité.

Il faut créer un délégué du type d’événement qui fait référence à la méthode qui devrait être appelé à partir de l’événement. Puis il compose ce délégué sur d’autres délégués que l’événement pourrait être connecté à l’aide de +=.

Exemple :

c.NumberReached += c_NumberReached;

Et pour détacher l’événement :

c.NumberReached -= c_NumberReached;

4) Événement du cycle de vie d’une page Web :

A chaque étape du cycle de vie d’une page, celle-ci déclenche des événements que vous pouvez gérer pour exécuter votre code utilisateur. Pour les événements de contrôle, vous devez lier le gestionnaire d’événements à l’événement,  soit de façon déclarative à l'aide d'attribut tel que (onclick), soit dans le code :

PreInit : Déclenché avant l’initialisation des contrôles de la page.

Init : Déclenché après que tous les contrôles ont été initialisés et tous les paramètres d'apparence ont été appliqués. Utilisez cet événement pour lire ou initialiser des propriétés de contrôle.

InitComplete : Déclenché par l'objet Page. Utilisez cet événement pour les tâches de traitement qui nécessitent que toute initialisation soit terminée.

PreLoad : Cet événement est exécuté avant l’événement Load de la page.

Load : La Page appelle la méthode d'événement OnLoad sur la Page, puis effectue la même opération de manière récursive pour chaque contrôle enfant, qui fait de même pour chacun de ses contrôles enfants jusqu'à ce que la page et tous les contrôles soient chargés.

LoadComplete : Cet événement est déclenché après le chargement de tous les contrôles de la page.

PreRender : Cet événement est utilisé pour développer des contrôles personnalisés (OnPreRender)

SaveStateComplete : Avant que cet événement ne se produise, ViewState a été enregistré pour la page et pour tous les contrôles. Toute modification apportée à la page ou aux contrôles à ce stade sera ignorée.

Unload : Cet événement se produit pour chaque contrôle, puis pour la page. On peut utiliser cet événement pour effectuer un dernier nettoyage pour des contrôles spécifiques, par exemple la fermeture des connexions de base de données spécifiques aux contrôles.

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.