在对我最近提出的问题(Here)的回答中,Hans Passant说我应该设置DialogResult
以关闭我的表单而不是form.Close()
,尽管我似乎无法找到为什么?
如果我已正确阅读,MSDN文档指出这样做只会隐藏表单而不是正确处理它我认为.Close()
要执行的操作?
当用户单击对话框的“关闭”按钮或设置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();
};
}
答案 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()
或将表单放入使用区。