События пользовательского элемента управления в C#

Я пытаюсь создать пользовательский элемент управления и должен вызвать событие из него. Идея состоит в том, чтобы вызвать событие в конце события click (OnAfterClick). Я нашел один или два учебника по этому вопросу, но явно упустил где-то шаг; У меня есть следующее.

В контроле:

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);
}

В программе используется элемент управления:

В InitializeComponent():

this.MyButton.AfterClick += new System.EventHandler(this.cmdMyButton_Click);

Эта строка дает мне ошибку компиляции (cmdMyButton_Click существует). Он говорит мне: не могу неявно преобразовать тип 'System.EventHandler' в 'Namespace.MyButton.AfterClick'

Может кто-нибудь сказать мне, что мне не хватает, или недоразумение по этому поводу, пожалуйста?

2 ответа

Решение

Ваше событие объявлено типом AfterClickEvnt, но вы пытаетесь подписаться на него, используя EventHandler, Вы не можете конвертировать между двумя.

Опции:

  • Явно укажите правильный тип:

    this.MyButton.AfterClick += new AfterClickEvnt(this.cmdMyButton_Click);
    
  • Используйте неявное преобразование группы методов:

    this.MyButton.AfterClick += cmdMyButton_Click;
    

Кстати, я предлагаю вам удалить свой собственный тип делегата и вместо этого использовать общий EventHandler<T> делегат:

public event EventHandler<AfterClickEventArgs> AfterClick;

В вашем коде есть некоторые несоответствия, поэтому трудно сказать, что происходит. (myArgs стал newArgs, а AfterClickUpdateEvnt стал AfterClickEvnt). Вы также пытаетесь использовать EventHandler вместо вашего делегата.

Кроме того, лучше использовать EventHandler<T> чтобы вам не пришлось беспокоиться о делегате:

public event EventHandler<AfterClickEventArgs> AfterClick;

Другие вопросы по тегам