2010-01-21 8 views
2

Je crée un contrôle personnalisé. Disons que je réinvente la roue et crée un contrôle Button personnalisé qui dérive de la classe UserControl (seulement par exemple)Quand déclencher un événement de contrôle personnalisé?

Eh bien, il a bien sûr un gestionnaire d'événements Click. Maintenant, mon problème est, quand dois-je appeler ce gestionnaire d'événements? Je sais que cela se produit parfois entre les pages OnLoad et OnLoadComplete, mais je ne suis pas sûr de l'événement auquel je peux me connecter pour que l'événement Click soit déclenché en même temps que d'autres événements de contrôle.

Quand devez-vous appeler des événements de contrôle personnalisés?

Répondre

2

En général, vous devez déclencher l'événement dès que vous savez que l'événement sous-jacent s'est produit.

Par exemple, comment le contrôle de bouton ASP.NET sait-il que le clic a été effectué par l'utilisation? Il implémente IPostBackEventHandler et la méthode RaisePostBackEvent(). Cette méthode sera appelée s'il existe des données d'événement de publication associées au contrôle. Je crois que l'association est déterminée par l'attribut "name" qu'elle rend. Dans RaisePostBackEvent(), il déclenche ensuite l'événement Click.

La question à laquelle vous devez répondre est: Comment votre contrôle sait-il qu'il devrait augmenter son événement? Une fois que vous trouvez que notre reste est facile.

Si votre contrôle a des similitudes avec les contrôles ASP.NET existants, je recommanderais stepping through the ASP.NET source code et de voir comment ces contrôles fonctionnent.

1

Si vous implémentez IPostbackEventHandler, vous pouvez faire quelque chose comme cela, pris de décompilation System.Web.Ui.WebControls.Button

protected virtual void RaisePostBackEvent(string eventArgument) 
{ 
    base.ValidateEvent(this.UniqueID, eventArgument); 
    if (this.CausesValidation) 
    { 
     this.Page.Validate(this.ValidationGroup); 
    } 
    this.OnClick(EventArgs.Empty); 
    this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument)); 
}