【问题标题】:Custom Control Events in C#C# 中的自定义控件事件
【发布时间】:2010-05-01 14:25:13
【问题描述】:

我正在尝试创建一个自定义控件并需要从中引发一个事件。这个想法是在点击事件(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”

谁能告诉我我错过了什么,或者对此有误解吗?

【问题讨论】:

    标签: c# .net events raiseevent


    【解决方案1】:

    您的事件被声明为AfterClickEvnt 类型,但您正尝试使用EventHandler 订阅它。您无法在两者之间进行转换。

    选项:

    • 明确说明正确的类型:

      this.MyButton.AfterClick += new AfterClickEvnt(this.cmdMyButton_Click);
      
    • 使用隐式方法组转换:

      this.MyButton.AfterClick += cmdMyButton_Click;
      

    顺便说一句,我建议您删除自定义委托类型,而改用通用的EventHandler<T> 委托:

    public event EventHandler<AfterClickEventArgs> AfterClick;
    

    【讨论】:

      【解决方案2】:

      您的代码存在一些差异,因此很难说发生了什么。 (myArgs 变为 newArgs,AfterClickUpdateEvnt 变为 AfterClickEvnt)。您还尝试使用 EventHandler 代替您的委托。

      另外,最好使用EventHandler&lt;T&gt;,这样您就不必为委托而烦恼:

      public event EventHandler&lt;AfterClickEventArgs&gt; AfterClick;

      【讨论】:

      • 抱歉 - 我已经清理了差异 :-)
      猜你喜欢
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多