【问题标题】:Subscribe to Event using a Delegate使用委托订阅事件
【发布时间】:2018-01-06 16:14:10
【问题描述】:

我正在尝试为我的表单上除按钮之外的所有控件订阅MouseUp 事件。我使用一个循环来订阅所有可以正常工作的控件。但是我希望能够在多个表单上使用此函数,因此我不想总是为事件订阅相同的函数,而是希望将函数作为参数传递。所以我创建了一个委托,但我收到了这个错误:

Cannot implicitly convert type 'namespace.frmSettings.MouseUpDelegate' to 'System.Windows.Forms.MouseEventHandler'

您能否告诉我我正在尝试做的事情是否可行,如果可以,我做错了什么?这是我的代码:

public frmSettings()
{
    InitializeComponent();

    //Subscribe to MouseUp events for key binds
    SubscribeMouseClicks(this, new MouseUpDelegate(frmSettings_MouseUp));
}

private delegate void MouseUpDelegate(object sender, MouseEventArgs e);
private void SubscribeMouseClicks(Control parentControl, MouseUpDelegate mouseUpDelegate)
{
    foreach (Control ctrl in parentControl.Controls)
    {
        if (ctrl.GetType() != typeof(Button))
        {
            ctrl.MouseUp += mouseUpDelegate; //This line causes the error. If I change mouseUpDelegate to frmSettings_MouseUp it works
            if (ctrl.HasChildren)
            {
                SubscribeMouseClicks(ctrl, mouseUpDelegate);
            }
        }
    }
}

我尝试过寻找答案,但找不到我要找的东西。

任何帮助将不胜感激。

【问题讨论】:

  • 只需使用MouseEventHandler,您现在使用MouseUpDelegate。如果可以使用提供的委托类型,则不需要自己的委托类型。
  • 谢谢,但这也不起作用。现在它说它无法将frmSettings.MouseEventHandler 转换为System.Windows.Forms.MouseEventHandler

标签: c# events delegates event-handling


【解决方案1】:

您不需要声明一个全新的委托来执行此操作。 MouseUp 事件是使用委托类型 MouseEventHandler 定义的。这意味着您只需要存储一个MouseEventHandler 的实例。

所以删除这个声明:

private delegate void MouseUpDelegate(object sender, MouseEventArgs e);

然后这样写方法:

private void SubscribeMouseClicks(Control parentControl, MouseEventHandler eventHandler)
{
    foreach (Control ctrl in parentControl.Controls)
    {
        if (ctrl.GetType() != typeof(Button))
        {
            ctrl.MouseUp += eventHandler;
            if (ctrl.HasChildren)
            {
                SubscribeMouseClicks(ctrl, eventHandler);
            }
        }
    }
}

然后这样称呼它:

SubscribeMouseClicks(this, frmSettings_MouseUp);

【讨论】:

  • 谢谢。当您发布答案时,我实际上已经解决了这个问题(rene 的评论将我指向了那个方向)。我没有意识到你可以将函数名作为参数传递。
  • @Daniel 如果参数的类型是委托并且两个签名匹配,您始终可以将方法作为参数传递。
猜你喜欢
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多