Мы создали новую форму, которую показываем через 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
у нас есть этот код (на основе этого ответа).
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
возникает дважды?
using
и вместо этого сохраняет ссылку на форму в переменной уровня класса в родительской форме. Я изменил свой вопрос, убрав блокusing
. - person Jeff B   schedule 16.02.2017