2015-05-21 3 views
0

Как я уже сказал в заголовке, я создаю программу. Однако я столкнулся с проблемой выполнения события FormClosing. Появится окно сообщения, и кнопки выполняют свою задачу хорошо, но когда я нажимаю «Да» или «Нет», он повторяется. К счастью, кнопка «Отмена» не имеет этой проблемы.Создание программы в C#, событие 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; 
    } 
} 

Ничто другое, что я нашел, очень помогло мне. Как я уже сказал ранее, окно сообщения появляется дважды. Это моя единственная проблема. Все остальное для этой пустоты отлично работает.

+2

Что произойдет, если вы удалите Application.Exit(); от вашего кода? Может быть, форма закрывается, и вы вызываете Application.Exit(); который снова запускает событие? –

+0

Можете ли вы опубликовать код, который вызывает Form1_FormClosing – matcheek

+0

Похоже, вы дважды зарегистрировали обработчик событий. Проверьте свой собственный и созданный конструктором код. – leppie

ответ

3

Ваша проблема в том, что вы звоните Application.Exit(). Как MSDN says,

Метод Выход останавливает все запущенные сообщение петли на всех потоках и закрывает все окна приложения

Другими словами, он будет стрелять снова событие формы закрытия.

Чтобы обойти это, вместо этого используйте Environment.Exit(0).

+0

Спасибо, это решило проблему немедленно. – MythrilMagician

1

Ваш второй MessageBox не имеет смысла, и вам не нужно выходить из приложения.
окно следует закрыть, если вы не установите e.Cancel истина:
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.
Но я бы этого не сделал.

+0

Это будет простая программа. Там действительно не будет много. Главное, он не собирается «закрывать» способ, которым пользуется Skype. – MythrilMagician

0

Вы действительно не должны бросать больше одного сообщения на пользователя ... вы можете прочитать this, this и this. Тем не менее, я считаю, что выходить с подсказкой, чтобы сохранить как одно из хороших мест для одного, , но не два.

У вас уже есть правильный механизм (они могут ответить «Да», «Нет» или «Отмена»). Измените свой вопрос, чтобы он был более понятным пользователю: «Вы хотите сохранить свою работу до выхода?» Если они отменяются, отмените, как вы используете e.Cancel. В противном случае просто позвольте форме закрыть ее.

Если они отвечают «нет», не спрашивайте снова. Я могу слышать их ...

"Я уже сказал вам, просто EXIT !!!"

+0

Нелепо, но все же хороший момент. Не знаю, почему я об этом не думал. Спасибо, что указали. – MythrilMagician