2010-10-04 3 views
3

J'ai créé un contrôle où d'autres développeurs peuvent créer une instance et l'utiliser. Il y a un clic de bouton dans le contrôle. Comment puis-je permettre aux développeurs de brancher leur propre code dans une certaine partie de mon contrôle? Je ne suis pas sûr si ou comment exactement utiliser un délégué ou un événement dans ce scénario. Quelqu'un peut-il aider dans l'exemple ci-dessous:Ajouter une propriété de délégué ou d'événement à cette classe?

public class MyControl : CompositeControl 
{ 
    ... 
    void btnSubmit_Click(object sender, EventArgs e) 
    { 
     //DO SOMETHING 
     if (success) 
     { 
     //CALL DEVELOPER'S LOGIC 
     } 
    } 
} 

Dans le code des développeurs, comment peuvent-ils passer dans leur logique lorsque le bouton clic de la commande est réussie?

protected override void CreateChildControls() 
{ 
    var ctlMyControl = new MyControl(); 

    //ADD SuccessCode() TO ctlMyControl 
    //SO IT IS TRIGGERED ON SUCCESS 
    //MAYBE SOMETHING LIKE: 
    //ctlMyControl.SuccessEvent = SuccessCode()?? 

    this.Control.Add(ctlMyControl); 
} 

protected void SuccessCode() 
{ 
    //DO SOMETHING 
} 

Comment mettre à jour MyControl pour permettre cela?

Répondre

5

Vous devez ajouter un event au contrôle, comme celui-ci:

void btnSubmit_Click(object sender, EventArgs e) { 
    //DO SOMETHING 
    if (success) { 
     OnSomethingCompleted(); 
    } 
} 

///<summary>Occurs when the operation is successfully completed.</summary> 
public event EventHandler SomethingCompleted; 
///<summary>Raises the SomethingCompleted event.</summary> 
internal protected virtual void OnSomethingCompleted() { OnSomethingCompleted(EventArgs.Empty); } 
///<summary>Raises the SomethingCompleted event.</summary> 
///<param name="e">An EventArgs object that provides the event data.</param> 
internal protected virtual void OnSomethingCompleted(EventArgs e) { 
    if (SomethingCompleted != null) 
     SomethingCompleted(this, e); 
} 

Dans la forme, vous pouvez ajouter un gestionnaire à l'événement, comme celui-ci:

myControl.SomethingCompleted += myControl_SomethingCompleted; 

void myControl_SomethingCompleted(object sender, EventArgs e) { 
    //Do things 
} 

Pour plus d'informations , voir le documentation.

+0

Je crois que la signature de EventHandler est (expéditeur d'objet, EventArgs e) mais votre gestionnaire n'a qu'une signature de (EventArgs e). Je ne pense pas que ça marchera comme ça? – Doug

+0

@Doug: Cela fonctionne. Lisez-le plus attentivement. Ce n'est pas un gestionnaire. – SLaks

+0

Ha oui je l'ai mal lu - Merci pour l'astuce ci-dessous btw, je ne savais pas qu'il y avait un membre "vide" statique de la classe EventArgs. – Doug

0

Vous devrez déclarer l'événement et, si nécessaire, créer une classe d'arguments d'événement personnalisée pour transmettre des informations sur l'événement.

Voici a blog post J'ai écrit il y a un moment qui marche dans le processus.

1

Étant donné que votre événement utilise la signature par défaut de type EventHandler, il vous suffit d'exposer un événement public de type EventHandler. Alors jetez un oeil au code ci-dessous.

Voici comment vous implémentez le nouvel événement!

public class MyControl : CompositeControl 
{ 
    //New public event declaration of type EventHandler 
    public event EventHandler Submit_OnClick; 

    void btnSubmit_Click(object sender, EventArgs e) 
    { 
     //DO SOMETHING 
     if (success) 
     { 
     //CALL DEVELOPER'S LOGIC 

     //Code to raise the event only if there are subscribers. 
     if (Submit_OnClick != null) 
     { 
      Submit_OnClick(this, new EventArgs()); 
     } 
     } 
    } 
} 

Voici comment vous utilisez le nouvel événement!

protected override void CreateChildControls() 
{ 
    var ctlMyControl = new MyControl(); 
     //Subscribed to the newly added event of your MyControl class 
     ctlMyControl.Submit_OnClick += new EventHandler(SuccessCode); 

    //ADD SuccessCode() TO ctlMyControl 
    //SO IT IS TRIGGERED ON SUCCESS 
    //MAYBE SOMETHING LIKE: 
    //ctlMyControl.SuccessEvent = SuccessCode()?? 

    this.Control.Add(ctlMyControl); 
} 

//Modified the signature to be compliant with EventHandler type 
protected void SuccessCode(object sender, EventArgs e) 
{ 
    //DO SOMETHING 
} 

Profitez-en!

+0

'EventArgs.Empty' – SLaks

0

Vous devez ajouter un événement à votre contrôle.

Quelque chose comme ceci:

public class MyControl : CompositeControl 
{ 
     public event EventHandler Success; 
     ... 
     void btnSubmit_Click(object sender, EventArgs e) 
    { 
     //DO SOMETHING 
     if (success) 
     { 
      //CALL DEVELOPER'S LOGIC 
      OnSuccess(); 
     } 
    } 

    private static void OnSuccess() 
    { 
     if(Success != null) 
     { 
       Success(this, EventArgs.Empty); //or you can pass event args you want. But you should use EventHandler<T> instead. 
     } 
    } 
} 

Et que d'autres développeurs peuvent youse votre contrôle comme celui-ci:

protected override void CreateChildControls() 
{ 
    var ctlMyControl = new MyControl(); 

    ctlMyConstrol += SuccessCode; 

    this.Control.Add(ctlMyControl); 
} 

protected void SuccessCode(object sender, EventArgs e) 
{ 
    //DO SOMETHING 
} 

Vous pouvez en savoir plus sur les événements sur MSDN.

Questions connexes