Application.Exit вызывает событие FormClose

Я работаю в .NET4.5 Winforms C #.

Мое приложение основано на шаблоне контроллера представления модели. На главной форме (просмотре) у меня есть кнопка Выход. Если пользователь нажимает эту кнопку, на контроллере вызывается метод, который очищает данные, а затем вызывает Application.Exit (). Это прекрасно работает.

Я также хотел бы запустить этот метод, когда пользователь нажимает крестик выхода окна по умолчанию в верхнем правом окне. Для этого я обрабатываю событие FormClosing. В этом Событии я снова вызываю метод контроллера, который вызывает Application.Exit ();

Проблема в том, что Application.Exit () также запускает событие FormClosing. Что создает двойной вызов. Конечно, я могу установить флаг и проверить это, но я чувствую, что делаю что-то не так.

Как правильно закрыть мое приложение winforms и очистить необходимые вещи. Я не хочу выполнять очистку в событии закрытия формы представления, это кажется уродливым.


person Enrico    schedule 26.09.2013    source источник
comment
Кнопка «Выход» закрывает форму?   -  person Oblivious Sage    schedule 22.01.2015


Ответы (1)


Правильный способ сделать это - включить код очистки в метод, который вызывается в обработчике событий FormClosing (на мой взгляд, ничего уродливого в этом нет). Вызов Application.Exit или закрытие приложения по старинке приводит к генерации этого события. Что запускает метод очистки.

private void Clicked(object sender, EventArgs e)
{
  Application.Exit();
}

private void FormClosing(object sender, CancelEventArgs e)
{
  Cleanup();
}

private void Cleanup()
{
  // do cleanup here
}
person meilke    schedule 26.09.2013
comment
Но это означает, что код очистки находится в моем представлении? Конечно, это работает нормально, но должен ли код очистки (доступ к базам данных, закрытие файлов и т. Д.) Не происходить в контроллере или модели? Я пытаюсь сделать представление как можно более тупым, чтобы я мог заменить его любым другим графическим интерфейсом и лучше протестировать. - person Enrico; 26.09.2013
comment
Я просто хотел бы отправить событие на свой контроллер и оттуда обработать закрытие приложения ... - person Enrico; 26.09.2013
comment
Это то, что вы бы сделали в Cleanup. - person meilke; 26.09.2013