Событие FormClosing запускается дважды после использования кнопки выхода - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть кнопка для выхода из формы, и это код

    DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
    if (dialogResult == DialogResult.No)
    {
    }
    else
    {
        Application.Exit();
    }

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

Я также попытался удалить код в событии FormClosing, чтобы он имел только Application.Exit (), но с помощью Alt + F4 или нажатия кнопки X автоматически выйдет из приложения.

У меня вопрос, как я могу спросить пользователя, хочет ли он выйти из программы, но не запускает диалог дважды?

Заранее спасибо, и я сообщаю всем вам, что я простоначинающий, и это мой самый большой проект, поэтому я хочу сделать это здорово.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Вот пример.Он только запрашивает подтверждение, если закрытие было инициировано пользователем - вы, вероятно, не хотите, чтобы при перезапуске Windows появлялся MessageBox.

private void form_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 
    {
        // Cancel the close
        e.Cancel = true;
    }
 }
0 голосов
/ 24 апреля 2018

Есть два способа добиться этого.

  • Отписаться даже на нажатие кнопки
  • Как предложено в ответе Стюарта, проверить причину закрытия (но в его ответе есть проблема, поэтому добавьте этот подход также с помощью 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.
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...