我想知道我是否做得正确。
我在我的类(也是一个表单)中实例化一个Form(让我们调用这个Form_B)并处理Form_B的Load事件。在这个事件中我做了一些初始化。
Form_B可以由用户多次显示,我在我的实例变量上调用ShowDialog。
问题是每次显示表单时都会调用Load。我尝试过调试,并尝试使用Show()而不是ShowDialog()。当我关闭窗口但ShowDialog()没有失败时Show()失败,但每次显示时都调用Load。
表单关闭后继续使用实例是否不正确?
谢谢, 斯蒂芬
答案 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()函数中。