将方法分配给接口中声明的用户控件上的事件

时间:2011-07-05 20:46:18

标签: c# events interface

在C#中,我正在构建要在自定义应用程序中使用的自定义控件。我希望每个控件都实现一个事件,如果控件内发生异常或错误(内部检查失败),则会触发该事件。我创建了一个声明事件的接口。我创建了实现该接口的用户控件。这是我的问题。

当我将一个自定义控件添加到表单时,我想循环遍历表单上的控件,检测作为我的自定义控件的所有控件,然后为我在界面中声明的事件分配一个事件处理程序。我找不到将对象强制转换为接口类型的方法。

考虑:

interface IMyInterface
{
    event ControlExceptionOccured ControlExceptionOccuredEvent;
...
}

public partial class TextControl : UserControl, IMyInterface {
...
  public event ControlExceptionOccured ControlExceptionOccuredEvent;
...
}

在我的表单上我使用了其中一个TextControl。我有这个方法:

private void Form1_Load(object sender, EventArgs e)
{
  foreach (Control Control in Controls)
  {
    if (Control.GetType().GetInterface(typeof(IMyInterface).FullName) != null)
    {
       ((IMyInterface)Control).ControlExceptionOccuredEvent += ControlExceptionHandler;
    }
  }
}

这符合但不会执行。如何将ControlExceptionHandler添加到事件链?

感谢所有试图提供帮助的人。

3 个答案:

答案 0 :(得分:0)

据我所知,您无法订阅事件,因为IF条件返回FALSE。你试着写这样的东西吗? :

foreach(Control ctrl in this.Controls){
    if((ctrl as IMyInterface) != null) {
        //do stuff
    }
}

答案 1 :(得分:0)

这是一种更简单的方法:

if (control is IMyInterface)
    ((IMyInterface)control).ControlExceptionOccuredEvent += ControlExceptionHandler;

......但你做这件事的方式也应该有效,所以你必须提供有关正在发生的事情的更多细节。

答案 2 :(得分:0)

代码

((IMyInterface)Control).ControlExceptionOccuredEvent += ControlExceptionHandler;

产生

  

无法将“... Text.TextControl”类型的对象转换为“IMyInterface”类型。

我不明白为什么不。

作为旁注,我替换了

if (Control.GetType().GetInterface(typeof(IMyInterface).FullName) != null)

if (Control is IMyInterface)

它不起作用。第二个例子永远不会返回true。我也试过

if ((Control as IMyInterface) != null)

它也永远不会返回true。