PC Easy Weblog

avril 24, 2009

CSharp – Evennement & Delegate & EventArgs, pour que ce soit clair

Filed under: Développement, Utilitaires — Étiquettes : , — trucmuche92 @ 11:02

Voici pas à pas les éléments à mettre en place pour exploiter de l’évennementiel depuis un UserControl.
L’exemple fournie illustre un UserControl qui est inclus dans les éléments d’une liste (un Datalist par exemple), ce Usercontrol déclenche un évennement lorsque l’utilisateur ajoute une quantité à son panier (dans le cas d’une boutioque en ligne).

1 – Définir un évennement (=définir un Delegate)

On créée un Delegate que l’on nomme UCMAJPanierEventHandler.
Un Delegate se situe au même niveau qu’une Class, il n’est donc pas à mettre en place à l’intérieur d’une Class ou d’un UserControl

Version Basique :

public delegate void UCMAJPanierEventHandler(object sender, EventArgs e);

object sender et EventArgs e sont la signature de base.
Si lors de l’évennement on veut transmettre des information supplémentaires, on peut créer une classe qui hérite de la classe EventArgs :

 public class UCMAJPanierEventArgs : EventArgs
 {
      public string pro_codesap;
       public string quantite;
 }

Dès lors la définition du Delegate deviendra :

public delegate void UCMAJPanierEventHandler(object sender, UCMAJPanierEventArgs e);

2 – Ajouter à son controle la possibilité d’utiliser ce Delegate en tant que Sender

 public partial class UCDetailProduit : System.Web.UI.UserControl
 {
      public event UCMAJPanierEventHandler UCMajPanier;
      ...
      ...
 }

On déclare donc un événement du type UCMAJPanierEventHandler, et au même titre qu’une propriété (exemple string), on lui donne un Nom (UCMajPanier)
Pour être accessible aux autres Controles, Pages, il doit être Public.

Pour « Raiser » l’Evt, la commande est this.UCMajPanier(this, args) où args est l’objet qui supporte les arguments que l’on veut envoyer avec l’événement.
Il est nécessaire de tester préalablement si L’événement est branché par un Controle « receveur » sinon cela génère une exception d’où if (this.UCMajPanier != null).

public partial class UCDetailProduit : System.Web.UI.UserControl
 {
    public event UCMAJPanierEventHandler UCMajPanier;
    ...
    ...
    protected void btn_ajouter_panier_Click(object sender, EventArgs e)
    {
        if (this.UCMajPanier != null)
        {
            UCMAJPanierEventArgs args = new UCMAJPanierEventArgs();
            args.pro_codesap = hidden_prd_code.Text;
            args.quantite = txt_qte.Text;
            this.UCMajPanier(this, args);
        }
    }
    ...
    ...
 }

3 – Connexion du Sender au Receveur

Lors de la génération du Controle Sender dans le Datalist, il faut créer une « connexion » entre le Sender et celui qui va gérer la réception de l’évennement.
Pour un Datalist, le moment idéal est l’evennement Item_Created :

public partial class prod_liste System.Web.UI.Page
{
....
 ....
protected void dlProduits_ItemCreated(object sender, DataListItemEventArgs e)
{
    if ((e.Item.ItemType == ListItemType.AlternatingItem) || (e.Item.ItemType == ListItemType.Item))
    {
        UCDetailProduit dp = e.Item.FindControl("UCDetailProduit") as UCDetailProduit;
        if (dp != null)
        {
           dp.UCMajPanier += new UCMAJPanierEventHandler(ProduitAjouterAuPanier);
        }
    }
    }
    ....
    ....
    protected void ProduitAjouterAuPanier(object sender, UCMAJPanierEventArgs e)
    {
        DataService.UpdatePanier(e.pro_codesap, e.quantite);
    }
    }
Publicités

Laisser un commentaire »

Aucun commentaire pour l’instant.

RSS feed for comments on this post. TrackBack URI

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Propulsé par WordPress.com.

%d blogueurs aiment cette page :