Form_Load()'event'或Override OnLoad()

时间:2010-09-08 18:29:37

标签: .net winforms events refactoring override

我希望有人尝试解释这些之间的区别。更具体地说,示例使用场景。

我正在重构一些 Windows表单代码,而FormForm_Load()事件中以及调用{{1}的protected override void OnLoad()事件中都有一些代码现在我跟踪它,Override首先触发,然后立即触发事件版本。

那么,通常使用哪一个?为什么?

3 个答案:

答案 0 :(得分:25)

您应该始终覆盖OnLoad()。只有当另一个类对该事件感兴趣时,才能使用该事件。这是什么事件。另一个对Load事件感兴趣的类是非常罕见的,只对窗口排列的东西非常有用。

仍然,Load事件适用于设计人员,VB6程序员对此非常熟悉。这不是非常错误,当你开始继承表单并且代码没有以正确的顺序运行时,你只会遇到麻烦。

现在大多数放在Load事件中的代码都属于构造函数。如果出现以下情况,您只需要OnLoad:

  • 您需要知道窗口的确切大小和位置。 OnLoad是最好的,创建窗口句柄并应用用户首选项(标题和边框大小),并根据Form.AutoScaleMode属性的指示重新调整表单。窗口尚不可见,是将窗口移动到其他地方或安排子控件的好时机。
  • 您的代码需要Handle属性。这很微妙,你不能总是说出来。在构造函数中使用类似代码是不健康的,窗口在构造函数完成之前创建。它通常会达到一个良好的目的,但它可以使形式非常慢。易于从“调用堆栈”窗口进行诊断。
  • 避免MDI实施中的错误。如果您在父构造函数中创建MDI子项,那么您将获得重复的字形,在您最大化子项时可见。而是在OnLoad中创建子项。

答案 1 :(得分:2)

覆盖OnLoad时,对base.OnLoad的调用会调用表单的Load - 事件。​​

protected override void OnLoad(EventArgs e)
{
  // do stuff before Load-event is raised
  base.OnLoad(e);
  // do stuff after Load-event was raised
}

如果在引发Load事件之前没有特别需要执行内容,则在 OnLoad之后将代码放在base.OnLoad(e) 中会产生与放置相同的运行时行为它在Form_Load事件处理程序中。

我建议覆盖该方法而不是订阅该事件。

答案 2 :(得分:0)

OnLoad引发加载事件,Form_Load处理该事件。请参阅MSDN article

因此,在您的代码中,在初始化函数结束时,您可以调用OnLoad函数。然后,基类将调用您的事件处理程序(在这种情况下为Form_Load),您可能已在初始化代码中设置了该事件处理程序。

就我个人而言,我会将我的代码放在Form_Init并离开OnLoad以启动此事件,因为我正在处理此事件,尽管您可以有充分理由进行辩护,如您所见你的答案。