c# - 处理新表格的正确方法

标签 c# .net forms winforms dispose

所以在我的应用程序中,我倾向于动态创建新的表单实例,然后使用 Form.Show() 来显示它们(非模态)。

private void test_click(object sender, EventArgs e)
{
    var form = new myForm();
    form.Show();
}

但是,Code Cracker 告诉我应该处理这些表格。所以,我用“using”语句包装它们,但它们在打开后立即关闭。

using (var form = new myForm())
{
    form.Show();
}

我不想使用 Form.ShowDialog(),因为在某些情况下我会打开只显示报告的新窗口;我不需要它们是模态的。

最佳答案

是否需要在关闭表单后处理表单?

当您使用 Show() 显示表单时,您不需要处理它,因为它会在关闭后处理。但是,当您使用 ShowDialog() 显示表单时,您需要处置该表单,因为它在关闭后不会处置。

当您关闭 Form 时,WM_CLOSE消息将被发送到窗口。如果你看一下 WmClose 的源代码处理 WM_CLOSE 消息的方法,您将看到:

  • 对于模态窗体(您使用 ShowDialog 显示),Dispose 方法将不会被调用,窗体在关闭后存在,您可以使用它的属性获取一些数据,或者您可以再次显示它。

  • 对于非模态表单(您使用 Show 显示),在表单关闭后,将调用 Dispose 方法。

结论是:

  • 当您使用 Show 方法显示表单时,您不需要(也不能)调用 Dispose。表格将在关闭后自行处理。

  • 当您使用 ShowDialog 显示表单时,您需要手动调用 Dispose。一个好的做法是在 using block 中使用模态形式。

示例

要显示模态对话框,最佳做法是使用 using block :

//form will be disposed after the using block
using (var f = new MyForm())
{
    if (f.ShowDialog() == DialogResult.OK)
    {
        //Your logic to handle OK here
    }
}

对于非模态对话框,显示并忽略它:

var f = new MyForm();
f.Show();

关于c# - 处理新表格的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39500280/

相关文章:

c# - Sharpziplib 压缩文件在外部解压缩

C#/.NET : Reporting subprocess state to the parent service

c# - 如何在 ASP.Net webapp 中的引用项目 DLL 中初始化 AutoMapper 配置文件

forms - django-filter 更改默认表单外观

javascript - js如何原型(prototype)化表单元素?

php - 在 HTML 表格设计中,根据输入框按高度动态增大/缩小文本框

c# - 只读和不带setter的prop有什么区别?

c# - 属性信息 : is the property an indexer?

c# - C# 中的三元运算符

.net - ASP.NET CheckBox 状态和 PostBack