C#中的自定义控件事件

时间:2010-05-01 14:25:14

标签: c# .net events raiseevent

我正在尝试创建一个自定义控件,需要从中引发一个事件。想法是在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 个答案:

答案 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;