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

#c# #winforms

#c# #winforms

Вопрос:

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

После того, как пользователь войдет в систему через LoginForm, он будет переведен в основную форму.

Я хотел бы закодировать его таким образом, чтобы после того, как пользователь нажмет крестик в строке заголовка в основной форме, было бы приглашение с запросом пользователя «Это закроет приложение. Подтвердить?», за которым следуют кнопки «Да» и «Нет».

Если да, появится другое окно: «Приложение закрыто!»

Если нет, 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)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
        System.Windows.Forms.Application.Exit();
    }
    else
    {
        this.Activate();
    }   
}
 

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

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

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

Ответ №1:

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

Попробуйте

 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;
    } 
}
 

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

РЕДАКТИРОВАТЬ: если 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();
}
 

Комментарии:

1. привет, спасибо за ваш ответ. это действительно работает. но не совсем тот результат, который я хотел. причина, по которой я кодировал в системе. Windows. Формы. Приложение. Exit(); потому что я хотел, чтобы все приложение завершилось. не только сама эта форма, поскольку она не является основной формой, и у меня есть несколько форм. итак, как мне это сделать?

2. О, основная форма — это не основная форма?. Хорошо, тогда просто добавьте вызов exit обратно в true case.

3. привет, я извиняюсь. все еще не уверен в этом. что вы имеете в виду под этим?

4. привет, это также было частью моей первоначальной проблемы. дело в том, что когда вы это делаете, окно запрашивается дважды, а не один раз. таким образом, вы бы нажали 4 окна yes yes yes yes, если бы я должен был закодировать его, используя первое поле кода, которое вы ввели.

5. @Томас ладно, думаю, теперь я тебя понял. Можете ли вы попробовать то, что я обновил выше? В данный момент я не могу это проверить.

Ответ №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:

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

 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;
    }   
}
 

Ответ №4:

Вы должны посмотреть, чтобы отменить свойство в 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

Комментарии:

1. привет, мне жаль, но я не понял, что ты пытаешься сказать. где та часть, которую я назвал дважды?

2. Здесь вам не нужен 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);
    }
    else
    {
        e.Cancel = true;
    }   
}
 

Редактировать: чтобы ответить на ваш первый вопрос, посмотрите это. Когда вы вызываете Exit() свое приложение, FormClosing событие вызывается для всех открытых форм, включая mainForm (которая все еще открыта), поэтому событие вызывается дважды. Обычно я ожидаю, что что-то подобное приведет к бесконечной рекурсии и буквальному переполнению стека, но я предполагаю.NET достаточно умен, чтобы предотвратить это.

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

Ответ №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();
    }   
}