Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建将多个事件处理程序附加到多个控件的函数?_C#_.net_Winforms_Events_.net 4.0 - Fatal编程技术网

C# 如何创建将多个事件处理程序附加到多个控件的函数?

C# 如何创建将多个事件处理程序附加到多个控件的函数?,c#,.net,winforms,events,.net-4.0,C#,.net,Winforms,Events,.net 4.0,问题: 如何创建将多个事件处理程序附加到多个控件的函数? 意图: 我正在使用C#开发一个windows窗体应用程序。我想创建一个函数,它接受一组控件和一组事件处理程序。此函数将事件处理程序附加到控件。最优雅、可重复使用的方法是什么。我有一个非常难看的方法来处理委托,但是这是一个很好的方法,但是对于我来说,把它放入一个循环中并放弃这个函数就不那么麻烦了。 我基本上想要的行为: 功能: attachHandlers(?controlCollection,?eventHandlers) 编

问题:
如何创建将多个事件处理程序附加到多个控件的函数?

意图:
我正在使用C#开发一个windows窗体应用程序。我想创建一个函数,它接受一组控件和一组事件处理程序。此函数将事件处理程序附加到控件。最优雅、可重复使用的方法是什么。我有一个非常难看的方法来处理委托,但是这是一个很好的方法,但是对于我来说,把它放入一个循环中并放弃这个函数就不那么麻烦了。

我基本上想要的行为:


功能:

attachHandlers(?controlCollection,?eventHandlers)


编辑:

我只是想订阅所有控件上相同事件的所有处理程序。在我的描述中,我没有明确指出这一点,因此我认为这就是所有混淆的原因。

如果所讨论的控件继承自相同的基类或接口(或者它们是相同的类),您可以执行以下操作:

void AttachClickEventHandlers(List<IClickableControl> controls, List<MyClickHandler> eventHandlers)
{
    foreach (var control in controls)
        foreach (MyClickHandler handler in eventHandlers)
            control.Click += handler;
}

您的函数如何知道处理程序应该订阅到哪个事件(
单击
输入
验证
,…)?不清楚您在寻找什么:您想要从{controls,eventname}到eventHandlers的映射类型?每个控件上都有多个事件。。。还不清楚每个控件是否有一组唯一的处理程序,或者您希望对多个(某些?)控件使用相同的处理程序。您仍然没有回答stakx的问题。该函数如何知道订阅处理程序的事件。@Servy我请求的函数只是一个通用函数,我将对其进行硬编码。这就是函数应该知道的。再次为这一混乱感到抱歉。在通用函数中,您不会硬编码它,而是希望它是通用的。在一个特定的实例中,这不是一般化的,您可以将其硬编码为一个特定的事件。考虑到您的工厂将对其进行硬编码,您计划将其硬编码到什么事件?它是否是
控件中的事件
,是否需要将输入控件的类型限制为某些子类型,以确保它们都具有适当的事件,等等。。。我去编辑我的问题,然后回来,基本上是你写的。你怎么知道你想附加到点击事件,或者集合中的每个控件都有相同的事件?@Servy我只是假设OP希望将所有处理程序订阅到所有控件上的相同事件。如果要附加click事件,也不需要任何接口。单击事件已经存在于
控件中,因此您知道所有控件都将有该事件。您还知道代理类型将是
EventHandler
。OP中的代码实际上不仅足够,而且更好。@dkroy我看不出您已经发布的代码中的问题。什么东西不管用?
void AttachClickEventHandlers(List<IClickableControl> controls, List<MyClickHandler> eventHandlers)
{
    foreach (var control in controls)
        foreach (MyClickHandler handler in eventHandlers)
            control.Click += handler;
}
public interface IClickableControl
{
    event MyClickHandler Click;
}