WinForms EndInit()在继承的表单上过早调用

时间:2013-04-16 00:54:09

标签: c# winforms inheritance initialization

我们在继承表单的初始化方面遇到了意外问题。我期待这个工作:

public class MyChildForm : BaseForm
{

    public MyChildForm() {
        InitializeComponent();
    }
    public overrides void EndInit() {
        base.EndInit();

        //Do special tweaks to buttons on MyChildForm!
        DoYoAwesomeThang(myButton);
    }
}

然而它崩溃是因为MyChildForm上的按钮尚未初始化。在调查时发现这是由于我们实例化MyChildForm时的以下事件序列:

  1. 名为

  2. 的BaseForm构造函数
  3. BaseForm.InitializeConstructor()名为

  4. BaseForm.InitializeConstructor触发EndInit()

  5. MyChildForm.EndInit()被调用....

    ...但MyChildForm.InitializeComponent()尚未调用,所以我没有按钮!!

  6. 所以我理解了这个问题,但我很困惑为什么我做错了。最后,我在InitializeComponent()之后将按钮调整放在MyChildForm构造函数中,这样可行,但我认为那种事情是EndInit()的工作。

    我的问题:

    1. 将按钮调整放在EndInit()中是不是错误?

    2. 是否无法实现在继承表单上实现的EndInit()?

1 个答案:

答案 0 :(得分:0)

当控件在表单中初始化时,

EndInit将被多次调用。有时,在调用EndInit时,将会有一些尚未初始化的控件。可能,Loaded事件正是您所寻找的。