Custom Control Eventi in C #
-
02-10-2019 - |
Domanda
Sto cercando di creare un controllo personalizzato e la necessità di generare un evento da esso. L'idea è quella di generare un evento al termine della manifestazione click (OnAfterClick). Ho trovato uno o due tutorial a fare questo, ma sto chiaramente manca un qualche passo; Ho il seguente.
Nel controllo:
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);
}
Nel programma usando il controllo:
In InitializeComponent ():
this.MyButton.AfterClick += new System.EventHandler(this.cmdMyButton_Click);
Questa linea è mi dà un errore di compilazione (cmdMyButton_Click esiste). E mi dice: Impossibile convertire implicitamente il tipo 'System.EventHandler' a 'Namespace.MyButton.AfterClick'
Qualcuno può dirmi che cosa mi manca, o equivoco su questo, per favore?
Soluzione
Il vostro evento è dichiarato essere di tipo AfterClickEvnt
, ma si sta cercando di iscriversi ad esso utilizzando un EventHandler
. Non è possibile convertire tra i due.
Opzioni:
-
esplicitamente indicare il tipo giusto:
this.MyButton.AfterClick += new AfterClickEvnt(this.cmdMyButton_Click);
-
Usa una conversione metodo di gruppo implicita:
this.MyButton.AfterClick += cmdMyButton_Click;
A proposito, vi consiglio di rimuovere il tipo delegato personalizzato e invece di utilizzare il generico EventHandler<T>
delegato:
public event EventHandler<AfterClickEventArgs> AfterClick;
Altri suggerimenti
Ci sono alcune discrepanze nel codice, quindi è difficile dire che cosa sta succedendo. (MyArgs divenne newArgs, e AfterClickUpdateEvnt divennero AfterClickEvnt). È inoltre tenta di utilizzare un EventHandler al posto del delegato.
Inoltre, è meglio usare EventHandler<T>
in modo che non c'è bisogno di preoccuparsi di un delegato:
public event EventHandler<AfterClickEventArgs> AfterClick;