Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每次触发的加载事件_C#_Windows_Events - Fatal编程技术网

C# 每次触发的加载事件

C# 每次触发的加载事件,c#,windows,events,C#,Windows,Events,我想知道我做的是否正确 我在我的类(也是一个表单)中实例化一个表单(我们称之为表单B)并处理表单B的加载事件。在这个事件中,我进行了一些初始化 表单B可以由用户多次显示,我在实例变量上调用ShowDialog 问题是每次我显示表单时都会调用Load。我尝试过调试,也尝试过使用Show()而不是ShowDialog()。Show()在关闭窗口时失败,但ShowDialog()没有失败,而是在每次显示时调用Load 表单关闭后继续使用实例是否不正确 谢谢, Stefan加载表单的所有组件后,将调用加

我想知道我做的是否正确

我在我的类(也是一个表单)中实例化一个表单(我们称之为表单B)并处理表单B的加载事件。在这个事件中,我进行了一些初始化

表单B可以由用户多次显示,我在实例变量上调用ShowDialog

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

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

谢谢,
Stefan

加载表单的所有组件后,将调用加载事件。如果重新显示该表单,其组件将再次加载,因此加载事件将再次触发


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

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

使用Load事件初始化表单与VB6天相比是一个错误。这在当时是非常重要的,不幸的是在Winforms designer的设计中延续了这一点。它使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资源。

我也有同样的问题。搜索一段时间后,我认为“ShowDialog”是一个例外

现在是2018年,微软已经开通了.Net。我查过来源,找到了这个

this.CalledOnLoad = false;
this.CalledMakeVisible = false;
在ShowDialog()函数中


为什么不将您自己的初始化添加到表单构造函数中,而不是自定义事件?@HadleyHope,因为这并不意味着初始化将作用于该表单的成员。假设他在主类中执行某些操作之前等待表单加载,那么他需要在加载的表单之外。这一点很好!在@Hans Passant的“initialized”逻辑中引发该事件听起来是正确的。此外,对于继承和虚拟成员,必须小心不要在基类的构造函数中调用它们,因此(!initialized)逻辑很好+1、@Vincent,要隐藏控件,只需使用control.hide方法:只是文档清楚地说明它在窗体第一次显示时发生。我开始认为ShowDialog可能是那个事件的一个例外。你的建议是正确的。我已经养成了一种习惯,试图使我的构造函数尽可能小,并且可能无意识地避免在构造函数中抛出异常。当然,这不是借口,不管异常被抛出到哪里,都应该处理异常。谢谢相反,加载事件处理程序中的异常会导致。