我们创建了一个要通过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/

10-15 17:00