我正在尝试创建一个自定义控件,需要从中引发一个事件。想法是在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'
有人可以告诉我我错过了什么,或者误解了吗?
答案 0 :(得分:3)
您的活动被宣布为AfterClickEvnt
类型,但您尝试使用EventHandler
订阅该活动。你无法在两者之间进行转换。
选项:
明确说明正确的类型:
this.MyButton.AfterClick += new AfterClickEvnt(this.cmdMyButton_Click);
使用隐式方法组转换:
this.MyButton.AfterClick += cmdMyButton_Click;
顺便说一下,我建议您删除自定义委托类型,而不是使用通用EventHandler<T>
委托:
public event EventHandler<AfterClickEventArgs> AfterClick;
答案 1 :(得分:0)
您的代码存在一些差异,因此很难说明发生了什么。 (myArgs成为newArgs,AfterClickUpdateEvnt成为AfterClickEvnt)。您还尝试使用EventHandler代替您的代理。
此外,最好使用EventHandler<T>
,这样您就不必为代理人烦恼了:
public event EventHandler<AfterClickEventArgs> AfterClick;