我们创建了一个要通过ShowDialog
显示的新表单,并在其中添加了“取消”按钮。这是我们从其父级打开表单的方式:
// _modalForm is a class-level instance of our ModalForm class
var result = _modalForm.ShowDialog(this);
MessageBox.Show(result.ToString());
这是
Click
中取消按钮的ModalForm
事件处理程序。private void btnCancel_Click(object sender, EventArgs e)
{
Close();
}
在我们的
FormClosing
事件中,我们有以下代码(基于this answer)。private void ModalForm_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
Hide();
_parentForm.RefreshData();
}
令人惊讶的是,当我们单击“取消”按钮(或使用表单顶部的“ X”按钮)时,
FormClosing
事件被引发两次。两次CloseReason
都是UserClosing
。我仔细检查以确保
InitializeComponent
不会被调用两次,并且我们只预订一次该事件。在表单的btnCancel
属性中未设置CancelButton
。在设计器中也没有设置DialogResult
。但是,当我检查ShowDialog
的返回值时,它设置为DialogResult.Cancel
。将
btnCancel_Click
更改为DialogResult = DialogResult.Cancel
而不是Close()
并在_parentForm.Refresh()
事件中除FormClosing
以外不执行任何操作可修复事件引发两次的问题。有谁知道为什么在这种特定情况下
FormClosing
事件被引发两次? 最佳答案
那是因为隐藏模态形式会使它以DialogResult.Cancel
作为对话框结果关闭。因此,如果在this.Hide()
事件中调用FormClosing
,该事件将再次引发。
想象一下,如果它没有关闭表单,则您的应用程序已被隐藏的模态表单阻止!
注意:答案描述了两次引发事件的原因。但是,如here和其他提到的那样,对于模态表单(使用ShowDialog显示),将不会调用Dispose方法,并且关闭后该表单仍然存在,您可以使用其属性来获取一些数据,或者可以再次显示它。因此,您无需调用hide方法。
有关更多信息,请查看:Do I need to Dispose a Form after the Form got Closed?
关于c# - 为什么在模态对话框中调用Hide()时,FormClosing会触发两次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42276233/