Как отобразить MessageBox в событии FormClosing, чтобы запросить отмену? - PullRequest
0 голосов
/ 10 марта 2012

Я использую этот код, но он не работает, что я делаю не так?

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
    }
    else
    {
        e.Cancel = true;
        this.Activate();
    }
}

Ответы [ 3 ]

4 голосов
/ 10 марта 2012

Я предполагаю, что вы скопировали этот код откуда-то и забыли фактически подписаться на событие FormClosing. Распространенная ловушка в C #, VB.NET использует ключевое слово Handles, чтобы избежать подобных ошибок. Выберите форму, щелкните значок молнии в окне «Свойства» и дважды щелкните «FormClosing», чтобы добавить код, который подписывается на событие.

Тем не менее, на самом деле не имеет смысла писать такой код. События предназначены для другого кода для получения уведомлений, класс не должен прослушивать свои собственные события. В Winforms каждое событие вызывается защищенным методом OnXxxx (), который вы можете переопределить. Вы можете вырезать и вставить приведенный ниже код и попасть в пропасть успеха, для этого не требуется никакого дополнительного кода, такого как код подписки на событие. И, что самое приятное, он в первую очередь отдает предпочтение пользовательским обработчикам событий, типу кода, о котором вы пока не знаете, и должен получить первый шанс при работе с уведомлением.

    protected override void OnFormClosing(FormClosingEventArgs e) {
        base.OnFormClosing(e);
        if (!e.Cancel) {
            if (MessageBox.Show("Really?", "Close", MessageBoxButtons.YesNo) != DialogResult.Yes) {
                e.Cancel = true;
            }
        }
    }
0 голосов
/ 10 марта 2012

Если эта форма была открыта с помощью FormName.ShowDialog () , внутри события FormClosing недостаточно установить e.Cancel = True.
Вам необходимо установить FormName.DialogResult на DialogResult.None , как четко задокументировано на MSDN

0 голосов
/ 10 марта 2012

Прикрепляется ли обработчик событий к форме?Чтобы проверить, перейдите в Свойства формы, затем на вкладку События и посмотрите, присутствует ли Form1_FormClosing против события FormClosing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...