正确使用DialogResult

在回答我最近的问题( 这里 )时,Hans Passant表示我应该设置DialogResult来关闭我的表单而不是form.Close()虽然我似乎无法找出原因?

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

从文档中提取 。

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

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

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

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

所以举个例子

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

无论是调用Close还是设置DialogResult属性都不是问题。 你只需要确保调用Dispose 。 我更喜欢使用using块:

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

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

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