使用代表订阅活动

时间:2018-01-06 16:14:10

标签: c# events delegates event-handling

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

MouseUp

你能否告诉我,我想做的事情是否可行,若然,我做错了什么?这是我的代码:

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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);