Подтвердить что ты не робот

Как показать приглашение MessageBox, когда пользователь нажал крест в строке заголовка

В настоящее время я разрабатываю приложение Windows Form Form С#.

После входа пользователя через loginForm, он будет перенесен в mainForm.

Я хотел бы закодировать его так, чтобы после того, как пользователь щелкнул крест на строке заголовка в mainForm, появится запрос с запросом пользователя "Это закроет приложение. Подтвердите?" затем нажмите кнопку "Да" и "Нет".

Если да, появится еще одно поле "Приложение закрыто!"

Если нет, то окно сообщения просто закроется, и приложение продолжит работу.

Мой текущий код:

private void mainForm_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);
        System.Windows.Forms.Application.Exit();
    }
    else
    {
        this.Activate();
    }   
}

однако это не сработает.

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

Во-вторых, если я нажимаю no, форма закрывается, и я не могу ее вернуть.

4b9b3361

Ответ 1

Чтобы отменить закрытие формы, в вашем заявлении else вам нужно e.Cancel = true;. Вам не нужен явный Exit в вашем истинном случае.

Попробуйте

private void mainForm_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();
    }   
}

Я предполагаю, что ваш второй MessageBox сказал, что он закрыт, если только для целей тестирования.

Вы, вероятно, только хотите.

private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) != DialogResult.Yes)
    {
        e.Cancel = true;
    } 
}

Обратите внимание, что инструкция проверяет, не ударили ли они да, а не удалили ее. Это означает, что если они попали в x в диалоговом окне, это не будет считаться подтверждением.

EDIT: Если mainForm не является основной формой

Хорошо, я думаю, что у меня есть то, что вы просите сейчас.

Что бы я сделал, это поставить код, который у меня есть в моем втором блоке кода выше в FormClosing, а затем в обработчике событий FormClosed есть этот

private void mainForm_FormClosed(Object sender, FormClosedEventArgs e)
{
    MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
    System.Windows.Forms.Application.Exit();
}

Ответ 2

Это поможет вам

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("Are you sure you want to close?", "Close", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
            e.Cancel = true;
    }

Ответ 3

Вы должны посмотреть свойство Cancel в FormClosingEventArgs: Это должно работать:

  private void mainForm_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; 
        }
    }

http://msdn.microsoft.com/en-us/library/system.windows.forms.formclosingeventargs.aspx

Ответ 4

Это сделает то, что вам нужно:

private void mainForm_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. Когда вы вызываете Exit() в своем приложении, событие FormClosing создается для всех открытых форм, включая mainForm (который все еще открыт), поэтому событие получает два раза. Обычно я ожидал бы что-то вроде этого, чтобы привести к бесконечной рекурсии и потоку, но я полагаю, что .NET достаточно умен, чтобы предотвратить это.

В соответствующей заметке вы действительно никогда не должны закрывать свою программу, вызывая Exit() - это своего рода запах кода.

Ответ 5

Чтобы получить желаемую функциональность, попробуйте использовать этот код:

private void mainForm_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);
        //no need to do anything here.
    }
    else
    {
        e.Cancel = true;
    }   
}

Ответ 6

var GetInput = MessageBox.Show("Do you want to Delete?", "Confirm Deletion",MessageBoxButton.OKCancel);

if (GetInput == MessageBoxResult.OK)
{ 
   //do what you like
}

Ответ 7

ваш код отлично работает для меня без ошибок.

private void exiteProToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("message", "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        Application.Exit();
    }
    else
    {
        this.Activate();
    }   
}