正确使用DialogResult

时间:2013-05-30 22:02:52

标签: c# winforms dialogresult

在对我最近提出的问题(Here)的回答中,Hans Passant说我应该设置DialogResult以关闭我的表单而不是form.Close(),尽管我似乎无法找到为什么?

如果我已正确阅读,MSDN文档指出这样做只会隐藏表单而不是正确处理它我认为.Close()要执行的操作?

来自文档的

Extract

  

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

另一方面,Microsoft创建了一个support page,其中说明了如何使用DialogResult属性,并在其“Verify It Works”部分中指出单击这样将关闭表单。

所以我的问题是双重的,我应该继续使用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();
            };
    }

2 个答案:

答案 0 :(得分:18)

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

所以例如

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

}

答案 1 :(得分:4)

无论是致电Close还是设置DialogResult财产都不是问题。您只需要确保拨打Dispose。我更喜欢使用using块:

using (Form1 form = new Form1())
{
    form.ShowDialog();
}

我原本以为您可以在已调用ShowDialog方法的Form上致电Close。不是这种情况。如果您使用ShowDialog以模态方式显示表单,则Close方法或设置DialogResult属性是否关闭它似乎无关紧要。似乎设置DialogResult只是关闭Form的捷径。

但无论您是致电Close还是设置DialogResult属性,关键是要确保您致电Dispose()或将表单放入使用区。