我们创建了一个新表单,我们通过ShowDialog
显示并添加了一个“取消”按钮。以下是我们从其父开放形式:为什么FormClosing在模态对话框中调用Hide()时会触发两次?
// _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()
并在FormClosing
事件无所事事,除了_parentForm.Refresh()
解决该事件的问题得到两次上调。
有没有人知道为什么在这种特殊情况下,FormClosing
事件会重复两次?
你在帮助太多。当你关闭它时,对话框已经隐藏起来,所以你不必调用Hide()并且不需要e.Cancel = true。你真正想要完成的是防止它被丢弃。没有需要帮助,它已经做到了。您可以简单地再次调用Show()以使其再次可见。相反,任何*确实*的对话需要完全消除需要明确的Dispose()调用。总是最容易用*使用*语句完成。 –
@HansPassant好的。上面的代码是一个重现此问题的示例应用程序。遇到此问题的实际应用程序不使用“使用”块,而是在父表单的类级变量中保留对表单的引用。我修改了我的问题以删除'using'块。 –