2010-05-01 2 views
1

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

В контроле:

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'

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

ответ

3

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

Варианты:

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

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

    this.MyButton.AfterClick += cmdMyButton_Click; 
    

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

public event EventHandler<AfterClickEventArgs> AfterClick; 
0

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

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

public event EventHandler<AfterClickEventArgs> AfterClick;

+0

К сожалению - я вычищен расхождения :-) –