正确使用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块中。
- mvc和EF中的多对多关系
- 是否有充分的理由在Program.cs / main中编写代码而不是使用类?
- XML:如何删除所有没有属性的节点或子元素
- 如何从本地存储的文件中读取JSON?
- C#Skype插件
- 执行测试时出错,如果使用CreateResponse扩展方法返回Azure Function HttpResonseMessage
- ListCollectionView泄漏内存吗?
- 只有LINQ to Entities中的排序输入才支持’Skip’方法。 必须在方法’Skip’之前调用’OrderBy’方法
- 为什么Dictionary <T1,List >不能转换为Dictionary <T1,IEnumerable >?