gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:50:43 27 4
gpt4 key购买 nike

我想知道我是否做对了。

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

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

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

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

谢谢,斯特凡

最佳答案

使用 Load 事件来初始化窗体是 VB6 时代的不合时宜。这在当时非常重要,不幸的是在 Winforms 设计器的设计中延续了这一点。它使加载成为表单的默认事件。

但这不是 .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 资源。

关于c# - 每次触发Form.Load事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5314362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com