每次触发Form.Load事件

时间:2011-03-15 15:54:05

标签: c# windows events

我想知道我是否做得正确。

我在我的类(也是一个表单)中实例化一个Form(让我们调用这个Form_B)并处理Form_B的Load事件。在这个事件中我做了一些初始化。

Form_B可以由用户多次显示,我在我的实例变量上调用ShowDialog。

问题是每次显示表单时都会调用Load。我尝试过调试,并尝试使用Show()而不是ShowDialog()。当我关闭窗口但ShowDialog()没有失败时Show()失败,但每次显示时都调用Load。

表单关闭后继续使用实例是否不正确?

谢谢, 斯蒂芬

4 个答案:

答案 0 :(得分:10)

使用Load事件来初始化表单是VB6时代的一个时代错误。当时非常重要,不幸的是,Winforms设计师的设计延续了这一点。它使Load成为表单的默认事件。

然而,这不是.NET方式,您使用构造函数初始化类对象。您需要覆盖OnLoad()(另一种.NET方式,事件是其他类中的代码)的时间是您关心表单的大小和位置。当用户更改Windows主题或以更高的DPI设置运行视频适配器时,它将不是设计大小和位置。因此,您可能希望使用OnLoad移动窗口或重新排列控件。实际上并不常见。

因此,请先使用构造函数修复首先的问题。如果你仍然需要OnLoad,那么只需使用一个bool标志来跟踪它是否已经运行。

    private bool initialized = false;

    protected override void OnLoad(EventArgs e) {
        if (!initialized) {
            initialized = true;
            // etc...
        }
        base.OnLoad(e);
    }

是的,只有在使用ShowDialog()时才有效。使用Show()显示的表单在关闭时会自动处理。使用ShowDialog()不会发生这种情况,以避免检索对话框结果时出现问题。重新创建对话框实例是更好的方法,除非真的关心保留最后输入的值。然而,这是一种非常昂贵的方式,表单对象需要很多的.NET和Windows资源。

答案 1 :(得分:3)

这是Load事件的正确行为,每次加载它都会被调用。如果要重用表单并避免使用Load事件,而不是关闭表单,则应隐藏表单并使用show方法在需要时将其删除。

答案 2 :(得分:2)

一旦加载了表单的所有组件,就会调用load事件。如果重新显示表单,则会再次加载其组件,因此会再次触发Load事件。

您可以触发一个自定义事件,该事件只会在您的表单构造函数中触发,如果您正在寻找它,但我认为在表单关闭后使用该表单是不好的做法。

答案 3 :(得分:0)

我遇到了同样的问题。经过一段时间的搜索,我认为“ShowDialog”是一个例外。

自2018年以来,MS已经开通了.Net。我检查过来源并发现了这个。

this.CalledOnLoad = false;
this.CalledMakeVisible = false;

在ShowDialog()函数中。

https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs,ab288b84e00f8282