正确使用DialogResult

Say*_*yse 27 c# dialogresult winforms

在回答我最近的一个问题(这里)时,汉斯帕斯特说我应该设置DialogResult关闭我的表格而不是form.Close()我似乎无法找出原因?

如果我已经正确阅读,MSDN文档说明这样做只会隐藏表单而不是正确处理它我认为.Close()这样做?

从文档中提取.

当用户单击对话框的"关闭"按钮或设置DialogResult属性的值时,不会自动调用Close方法.相反,表单是隐藏的,可以再次显示,而无需创建对话框的新实例.由于此行为,您必须在应用程序不再需要表单时调用表单的Dispose方法.

另一方面,Microsoft创建了一个支持页面,其中说明了如何使用DialogResult属性,并在其"验证它工作"部分中声明单击这样将关闭表单.

所以我的问题是双重的,我应该继续使用Close或DialogResult; 并且对话框结果关闭或隐藏表单.从我下面的代码(一个带有两个按钮的简单表单),看起来它确实只是作为一个断点点this.Close()被隐藏...(this.Close()注释,表单仍然消失,只是不确定是否隐藏)

    public Form1()
    {
        InitializeComponent();
        button1.Click += (s, e) =>
            {
                 //I edited my question to include using
                using(Form1 form = new Form1())
                {
                    form.ShowDialog();
                }

            };
        button2.Click += (s, e) => 
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            };
    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 20

当您使用ShowDialog打开模式对话框时,调用代码将被阻止,直到表单调用关闭或隐藏.如果您想要读取被调用表单的一些公共属性并希望根据单击"确定"或"取消"按钮执行操作(例如将数据保存到数据库或文件),则需要知道用户是否需要是否采取行动.ShowDialog()方法返回的DialogResult允许您采取适当的操作......

所以举个例子

using (Form1 form = new Form1())
{
    DialogResult dr = form.ShowDialog();
    if(dr == DialogResult.OK)
    {
        string custName = form.CustomerName;
        SaveToFile(custName);
    }

}
Run Code Online (Sandbox Code Playgroud)

  • @Sayse是的,你是对的.我们正在处理两个不同的概念.在这里的答案中,使用`using`来处理`Dispose()`概念.另一个概念是设置`DialogResult`以指示对话框关闭的方式 - 因此启动对话框的代码可以告诉如何在必要时做出响应.通常您可能会忽略结果,但这取决于对话框的创建者.对话框应始终报告关闭的原因,以便为创建者提供该选项.(如果它只有一个退出状态,则无关紧要) (3认同)

Dan*_*Dan 5

您是否调用Close或设置DialogResult属性并不是真正的问题。您只需要确保调用Dispose. 我更喜欢使用 using 块执行此操作:

using (Form1 form = new Form1())
{
    form.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

我最初认为你可以调用ShowDialog一个Form已经调用了它的Close方法。不是这种情况。如果您使用 以模态方式显示表单ShowDialog,则它是否因Close方法或设置DialogResult属性而关闭似乎无关紧要。似乎设置DialogResult只是关闭Form.

但是,无论是调用Close还是设置DialogResult属性,关键是要确保调用Dispose()或将表单放在 using 块中。

  • 我真的不想对此进行争论,特别是因为我认为 WinForms 早已消亡,所以我会放弃。但问一下:如果不需要调用`Dispose`,为什么还要实现`IDisposable`呢? (2认同)