在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添加到事件链?
感谢所有试图提供帮助的人。
答案 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。