我有一个类似插件的应用程序。 所有申请表都从基础UserControl继承:
public class BaseUserControl : UserControl
{
// some common properties and methods
//
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
}
}
并在不同的程序集中编译。
当我想要显示表单时,它会经历以下顺序:
assembly = Assembly.LoadFile(assemblypath);
.
.
frm = (BaseUserControl)assembly.CreateInstance(frmname);
.
.
SomeContainer.Controls.Add(frm);
MainScreen.Controls.Add(SomeContainer);
这些形式的共同结构是:
public class TestForm : BaseUserControl {
public TestForm(){InitializeComponent();}
private void InitializeComponent(){
.
.
this.Load += new System.EventHandler(this.TestForm_Load);
.
}
private void TestForm_Load(object sender, EventArgs e){}
}
问题是这些表单的Load事件不会被触发。
另一种行为,我不明白,当在基类的OnLoad中设置断点时,调用堆栈显示从InitializeComponent中调用。
关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
你无可救药地混淆了Form和UserControl这两个术语,很难给出一个好的答案。他们是非常不同的野兽,你不能把UC变成一种形式。它是一个客户端窗口,而不是顶级窗口。我怀疑这与您的问题有关,但通用诊断是有人重写OnLoad而不是调用base.OnLoad()。
是的,可以从InitializeComponent()中的代码调用OnLoad。它不是很健康,因为OnLoad将在构造函数完成之前运行,但它是受支持的。当您触摸需要创建句柄的属性时,会发生这种情况。调用堆栈应该显示哪个特定的属性赋值执行此操作,只需双击调用堆栈中的行。