Как показать подсказку MessageBox, когда пользователь щелкнул крестиком в строке заголовка - PullRequest
19 голосов
/ 31 октября 2011

В настоящее время я разрабатываю приложение Windows C # 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();
    }   
}

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

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

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

Ответы [ 7 ]

30 голосов
/ 31 октября 2011

Чтобы отменить закрытие формы, в своем операторе 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;
    } 
}

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

РЕДАКТИРОВАТЬ: если 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 голосов
/ 31 октября 2011

Это должно помочь вам

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;
    }
1 голос
/ 31 октября 2011

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

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;
    }   
}
1 голос
/ 31 октября 2011

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

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() - это своего рода запах кода.

1 голос
/ 31 октября 2011

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

0 голосов
/ 22 июня 2017

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

private void exiteProToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("message", "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        Application.Exit();
    }
    else
    {
        this.Activate();
    }   
}
0 голосов
/ 30 января 2013
var GetInput = MessageBox.Show("Do you want to Delete?", "Confirm Deletion",MessageBoxButton.OKCancel);

if (GetInput == MessageBoxResult.OK)
{ 
   //do what you like
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...