При создании программы на C# событие FormClosing выполняется дважды
Как я сказал в названии, я создаю программу. Тем не менее, я сталкиваюсь с проблемой FormClosing
событие выполняется дважды. Появляется окно сообщения, и кнопки хорошо выполняют свое назначение, но когда я нажимаю "Да" или "Нет", оно повторяется. К счастью, кнопка "Отмена" не имеет этой проблемы.
private void Form1_FormClosing (object sender, FormClosingEventArgs e)
{
DialogResult dialog = MessageBox.Show("Do you want to save your progress?", "Media Cataloguer", MessageBoxButtons.YesNoCancel);
if (dialog == DialogResult.Yes)
{
SaveFileDialog savefile = new SaveFileDialog();
savefile.Filter = "Text files|*.txt";
savefile.Title = "Save As";
savefile.ShowDialog();
System.IO.FileStream fs = (System.IO.FileStream)savefile.OpenFile();
Application.Exit();
}
else if (dialog == DialogResult.No)
{
MessageBox.Show("Are you sure?", "Media Cataloguer", MessageBoxButtons.YesNo);
Application.Exit();
}
else if (dialog == DialogResult.Cancel)
{
e.Cancel = true;
}
}
Ничто другое, что я нашел, не очень помогло мне. Как я уже говорил ранее, окно сообщения появляется дважды. Это моя единственная проблема. Все остальное для этой пустоты работает нормально.
3 ответа
Ваша проблема в том, что вы звоните Application.Exit()
, Как говорит MSDN,
Метод Exit останавливает все запущенные циклы сообщений во всех потоках и закрывает все окна приложения.
Другими словами, он снова запустит событие закрытия формы.
Чтобы обойти это, используйте Environment.Exit(0)
вместо.
Ваш второй MessageBox не имеет смысла, и вам не нужно выходить из приложения.
Окно должно закрыться, если вы не установите для e.Cancel значение true:
https://msdn.microsoft.com/en-us/library/system.windows.window.closing%28v=vs.110%29.aspx
private void Form1_FormClosing (object sender, FormClosingEventArgs e) {
DialogResult dialog = MessageBox.Show("Do you want to save your progress?", "Media Cataloguer", MessageBoxButtons.YesNoCancel);
if (dialog == DialogResult.Yes) {
SaveFileDialog savefile = new SaveFileDialog();
savefile.Filter = "Text files|*.txt";
savefile.Title = "Save As";
savefile.ShowDialog();
System.IO.FileStream fs = (System.IO.FileStream)savefile.OpenFile();
} else if (dialog == DialogResult.No) {
if(MessageBox.Show("Are you sure?", "Media Cataloguer", MessageBoxButtons.YesNo) == DialogResult.No){
e.Cancel = true;
}
} else if (dialog == DialogResult.Cancel) {
e.Cancel = true;
}
}
Я бы не вышел из приложения при закрытии окна.
Он не предназначен для выполнения этой задачи.
Вы можете использовать настройки проекта, чтобы определить, когда приложение выйдет.
Или, если вам нужно больше контроля, вы можете использовать его в App.cs.
Но я бы не стал делать это здесь.
Вы действительно не должны бросать больше, чем один ящик сообщений пользователю... вы можете прочитать это, это и это. Тем не менее, я считаю выход с приглашением сохранить как одно из хороших мест для одного, но не для двух.
У вас уже есть правильный механизм (они могут ответить Да, Нет или Отмена). Пересмотрите свой вопрос, чтобы он был более понятным для пользователя: "Хотели бы вы сохранить свою работу перед выходом?" Если они отменяют, то отмените, как вы используете e.Cancel
, В противном случае, просто дайте форме закрыться самостоятельно.
Если они ответят нет, не спрашивайте снова. Я слышу их сейчас...
"Я уже говорил тебе, просто ВЫХОД!!!"