从另一个程序集加载的继承用户控件中未触发加载事件(Winforms)

时间:2010-08-06 15:09:33

标签: winforms user-controls

我有一个类似插件的应用程序。 所有申请表都从基础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中调用。

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:3)

你无可救药地混淆了Form和UserControl这两个术语,很难给出一个好的答案。他们是非常不同的野兽,你不能把UC变成一种形式。它是一个客户端窗口,而不是顶级窗口。我怀疑这与您的问题有关,但通用诊断是有人重写OnLoad而不是调用base.OnLoad()。

是的,可以从InitializeComponent()中的代码调用OnLoad。它不是很健康,因为OnLoad将在构造函数完成之前运行,但它是受支持的。当您触摸需要创建句柄的属性时,会发生这种情况。调用堆栈应该显示哪个特定的属性赋值执行此操作,只需双击调用堆栈中的行。