我有一个定义事件的界面:
public interface IControl
{
event EventHandler Load;
}
我正在使用UserControl
来实现此接口,因为它已经有了Load事件,我希望它通过IControl
接口向其他实体公开。 C#很好用,所有内容都可以构建并运行良好。但是,拥有此表单的Designer遇到错误。
Method not found: 'Void MyControls.IControl.add_Load(System.EventHandler)'.
表单设计师似乎期待Load
的两种不同实现,一种用于UserControl
,一种用于接口。
我知道一个解决方案是在我的界面上更改事件的签名,然后在UserControl
本身添加一个处理界面事件的处理程序。然而,看起来很奇怪,这个问题会出现。如果C#很好用,为什么设计师会惊慌失措呢?
这是Windows窗体的限制,还是有办法解决这个问题?
这将破坏父Form
的设计者,它将显示上面的错误:
public interface IControl
{
// the interface defines Load
event EventHandler Load;
}
// the control implements the interface, but UserControl defines Load,
// so I dont have to explicitly put an implementation of Load in MyControl
public class MyControl : UserControl, IControl
{
public MyControl()
{
InitializeComponent();
}
}
public class MyOtherClass
{
private bool _controlLoaded;
public MyOtherClass(IControl control)
{
// the Load event is exposed to other entities through the interface
control.Load += control_Load;
}
private void control_Load(object sender, EventArgs e)
{
_controlLoaded = true;
}
}
可以避免此问题的解决方案:
public interface IControl
{
// change this from Load to Loaded
event EventHandler Loaded;
}
public class MyControl : UserControl, IControl
{
public event EventHandler Loaded;
public MyControl()
{
InitializeComponent();
// add an event handler for Load
Load += this_Load;
}
private void this_Load(object sender, EventArgs e)
{
// indirectly fire Loaded
if (Loaded != null)
{
Loaded(sender, e);
}
}
}
public class MyOtherClass
{
private bool _controlLoaded;
public MyOtherClass(IControl control)
{
control.Loaded += control_Loaded;
}
private void control_Loaded(object sender, EventArgs e)
{
_controlLoaded = true;
}
}
虽然我知道解决问题的方法,但我很好奇是否有人知道任何其他解决方案,或者是否有人知道此问题的原因或细节。
答案 0 :(得分:0)
抱歉,我无法在声誉中添加评论:)
我确实完成了你的结构,然后我添加了一个只有用户控件MyControl
的表单我可以编辑它并做我需要的。
我也以这种方式编辑了表单构造函数
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new MyOtherClass(myControl1);
}
}
它按预期工作。
我正在使用VS2010