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

Я пытаюсь создать пользовательский элемент управления, и мне нужно вызвать событие из него. Идея состоит в том, чтобы вызвать событие в конце события 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 ]

3 голосов
/ 01 мая 2010

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

Параметры:

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

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

    this.MyButton.AfterClick += cmdMyButton_Click;
    

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

public event EventHandler<AfterClickEventArgs> AfterClick;
0 голосов
/ 01 мая 2010

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

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

public event EventHandler<AfterClickEventArgs> AfterClick;

...