Есть два способа добиться этого.
- Отписаться даже на нажатие кнопки
- Как предложено в ответе Стюарта, проверить причину закрытия (но в его ответе есть проблема, поэтому добавьте этот подход также с помощью fix, чтобы он помог будущим людям.)
Я предполагаю, что поскольку в обоих случаях вам нужно это подтверждение, нажатие кнопки и нажатие кнопки «x», вы поместили одинаковый код в оба обработчика.
Подход один
В обработчике нажатия кнопки, когда вы запрашиваете подтверждение пользователя и если пользователь нажимает «да».
До линии
Application.Exit();
Вы должны отписаться от события закрытия формы. Делая это, он не должен вызывать событие закрытия формы при выполнении Application.Exit ()
при условии, что ваша форма - MainForm, а событие - MainForm_Closing, это будет выглядеть,
private void btnClose_Click(object sender, EventArgs e)
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
this.FormClosing -= MainForm_FormClosing;
Application.Exit();
}
}
, поэтому он не будет вызывать событие закрытия формы при выполнении Application.Exit()
, и, таким образом, ваша проблема будет решена.
Второй подход
Как и предполагал stuartd (по моему мнению, это более понятный способ. +1), вы можете проверить причину закрытия формы в Form Closing
обработчике событий.
Обратите внимание , что в его примере кода есть небольшая проблема (ошибка) [которую вы уже приняли в качестве ответа !!]. После нажатия 'x' button
или Alt+F4
по ошибке; если пользователь нажимает «Нет» в сообщении с подтверждением, то форма закрывается, так как не выполняется обработка условия else. Правильное решение должно быть, как показано ниже.
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
Application.Exit();
else
e.Cancel = true; //stopping Form Close perocess.
}
}