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?

È stato utile?

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;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top