Control personalizado Eventos en C #
-
02-10-2019 - |
Pregunta
Estoy intentando crear un control personalizado y la necesidad de generar un evento de ella. La idea es generar un evento al final del evento click (OnAfterClick). He encontrado uno o dos tutoriales sobre cómo hacer esto, pero estoy perdiendo claramente un paso en alguna parte; Tengo el siguiente.
En el control:
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);
}
En el programa usando el control de:
En InitializeComponent ():
this.MyButton.AfterClick += new System.EventHandler(this.cmdMyButton_Click);
Esta línea es que me da un error de compilación (cmdMyButton_Click qué existe). Me dice: No se puede convertir implícitamente el tipo 'System.EventHandler' a 'Namespace.MyButton.AfterClick'
Puede alguien decirme lo que me falta, o un malentendido acerca de esto, por favor?
Solución
Su evento se declara de tipo AfterClickEvnt
, pero que está tratando de suscribirse a él mediante un EventHandler
. No se puede convertir entre los dos.
Opciones:
-
explícitamente indicar el tipo correcto:
this.MyButton.AfterClick += new AfterClickEvnt(this.cmdMyButton_Click);
-
Usar una conversión grupo método implícito:
this.MyButton.AfterClick += cmdMyButton_Click;
Por cierto, le sugiero que quita el tipo de delegado personalizada y que utiliza el genérico delegado EventHandler<T>
:
public event EventHandler<AfterClickEventArgs> AfterClick;
Otros consejos
Hay algunas discrepancias en su código, por lo que es difícil decir lo que está pasando. (MyArgs convirtió newArgs, y se convirtió en AfterClickUpdateEvnt AfterClickEvnt). También intenta utilizar un manejador de sucesos en lugar de su delegado.
Además, es mejor usar EventHandler<T>
de modo que usted no tiene que molestarse con un delegado:
public event EventHandler<AfterClickEventArgs> AfterClick;