c# – 每次触发Form.Load事件

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

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

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

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

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

谢谢,
斯特凡

使用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资源.

相关文章
相关标签/搜索