Пользовательские события управления в C#
-
02-10-2019 - |
Вопрос
Я пытаюсь создать пользовательский элемент управления, и мне нужно собрать из него событие. Идея состоит в том, чтобы собрать событие в конце события 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'
Кто -нибудь может сказать мне, что мне не хватает, или недоразумение в этом, пожалуйста?
Решение
Ваше мероприятие объявлено 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 стал послепериканье). Вы также пытаетесь использовать eventhandler вместо своего делегата.
Кроме того, лучше использовать EventHandler<T>
так что вам не нужно беспокоиться с делегатом:
public event EventHandler<AfterClickEventArgs> AfterClick;