【问题标题】:How can I create a function that attaches multiple event handlers to multiple controls?如何创建将多个事件处理程序附加到多个控件的函数?
【发布时间】:2012-06-08 17:09:36
【问题描述】:

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

意图:
我正在使用 C# 开发 Windows 窗体应用程序。我想创建一个函数,该函数采用一组控件和一组事件处理程序。此函数会将事件处理程序附加到控件。什么是最优雅、最可重用的方法。我有一个非常丑陋的方式来处理委托,但它是一个但对我来说只是把它扔进一个循环并放弃这个函数的工作较少。

我基本上想要的行为:

foreach(Control control in controlCollection)
     foreach(EventHandler handler in eventHandlerCollection)
                    control.Event += handler;


功能:
attachHandlers(? controlCollection, ? eventHandlers)

编辑:
我只是要将所有处理程序订阅到所有控件上的相同事件。我没有在我的描述中明确说明这一点,所以我相信这就是造成所有混乱的原因。

【问题讨论】:

  • 你的函数如何知道处理程序应该订阅哪个事件(ClickEnterValidating、...)?
  • 不清楚您在寻找什么:您想要从 {controls,eventname} 到 eventHandlers 的哪种映射?每个控件上有多个事件...也不清楚每个控件是否有一组唯一的处理程序,或者您想对多个(一些?)控件使用相同的处理程序。
  • 您还没有回答 stakx 的问题。函数如何知道处理程序订阅哪个事件。
  • @Servy 我要求的函数只是一个通用的函数,我将在其中对其进行硬编码。这就是函数如何知道的。再次为造成的混乱感到抱歉。
  • 在一般用途的函数中,您不会对其进行硬编码,而是希望它是通用的。在特定情况下,这不是通用的,您可以将其硬编码为特定事件。鉴于您要对其进行硬编码,您打算将其硬编码到什么事件?会不会是Control 中的事件,您是否需要将输入控件的类型限制为某些子类型以确保它们都具有适当的事件,等等。

标签: c# .net winforms events .net-4.0


【解决方案1】:

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

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;
}

【讨论】:

  • 哇...我去编辑我的问题并回来,你基本上写了它。
  • 你怎么知道你想附加到点击事件,甚至是集合中每个控件的相同事件?
  • @Servy 我只是假设 OP 希望所有处理程序订阅所有控件上的相同事件。
  • 如果你附加点击事件,你也不需要任何接口。点击事件已经存在于Control 中,所以你知道所有的控件都会有这个事件。您还知道委托类型将是EventHandler。 OP本身的代码其实不仅够用,而且更胜一筹。
  • @dkroy 我在您已经发布的代码中看不到问题。什么不工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
相关资源
最近更新 更多