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

本文关键字:调用 EndInit 继承 表单 | 更新日期: 2023-09-27 18:09:27

在初始化继承表单时遇到了一个意想不到的问题。我希望这能起作用:

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. BaseForm构造函数调用

  2. BaseForm.InitializeConstructor()称为

  3. 标识。InitializeConstructor触发EndInit()

  4. MyChildForm.EndInit()被称为....

    …但是MyChildForm.InitializeComponent()还没有调用,所以我没有我的按钮!!

所以我明白了这个问题,但是我很困惑为什么我做错了。最后,我把按钮调整在InitializeComponent()之后的MyChildForm构造函数中,这是有效的,但我认为这种事情是EndInit()的工作。

我的问题:

  1. 把按钮调整在EndInit()里面是错误的吗?

  2. 是不可能实现EndInit()上实现继承的形式?

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

EndInit将在窗体中初始化控件时被多次调用。有时,在调用EndInit时,会有尚未初始化的控件。可能,Loaded事件是你正在寻找的。