Custom Control Events in C #
-
02-10-2019 - |
Frage
Ich versuche, eine benutzerdefinierte Steuerelement zu erstellen und benötigen ein Ereignis daraus zu erhöhen. Die Idee ist, ein Ereignis am Ende des Click-Ereignisses (OnAfterClick) zu erhöhen. Ich fand ein oder zwei Tutorials auf diese Weise, aber ich bin fehlt eindeutig einen Schritt irgendwo; Ich habe folgende.
Bei der Steuerung:
public class AfterClickEventArgs : EventArgs
{
...
}
public partial class MyButton : CommandButton
{
public delegate void AfterClickEvnt(object sender, AfterClickEventArgs e);
public event AfterClickUpdatedEvnt AfterClick;
}
protected override void OnClick(EventArgs e)
{
...
Processing here
...
AfterClickEventArgs myArgs = new AfterClickEventArgs();
AfterClick(this, myArgs);
}
Im Programm über die Steuerung:
In InitializeComponent ():
this.MyButton.AfterClick += new System.EventHandler(this.cmdMyButton_Click);
Diese Zeile gibt mir einen Compiler-Fehler (cmdMyButton_Click vorhanden ist). Es sagt mir: Kann nicht implizit Typ umwandeln ‚System.EventHandler‘ auf ‚Namespace.MyButton.AfterClick‘
Kann mir jemand sagen, was ich fehle, oder über das Missverständnis, bitte?
Lösung
Ihre Veranstaltung wird erklärt vom Typ AfterClickEvnt
sein, aber Sie versuchen, es mit einem EventHandler
zu abonnieren. Sie können nicht zwischen den beiden konvertieren.
Optionen:
-
Explizit die richtige Art angeben:
this.MyButton.AfterClick += new AfterClickEvnt(this.cmdMyButton_Click);
-
Verwendung einer impliziten Verfahren Gruppe Umwandlung:
this.MyButton.AfterClick += cmdMyButton_Click;
By the way, ich schlage vor, Sie Ihre benutzerdefinierten Delegattyp entfernen und stattdessen den allgemeinen EventHandler<T>
Delegaten verwenden:
public event EventHandler<AfterClickEventArgs> AfterClick;
Andere Tipps
Es gibt einige Unstimmigkeiten in Ihrem Code, so ist es schwer zu sagen, was los ist. (MyArgs wurde newArgs und AfterClickUpdateEvnt wurde AfterClickEvnt). Sie versuchen auch einen Eventhandler anstelle Ihren Delegierten zu verwenden.
Außerdem ist es besser zu Einsatz EventHandler<T>
, so dass Sie müssen nicht mit einem Delegierten stören:
public event EventHandler<AfterClickEventArgs> AfterClick;