web-dev-qa-db-fra.com

Comment afficher une invite MessageBox lorsque l'utilisateur a cliqué sur la croix dans la barre de titre

Je développe actuellement une application de formulaire Windows C #.

Une fois que l'utilisateur s'est connecté via loginForm, il sera amené à mainForm.

Je voudrais le coder de manière à ce qu’après que l’utilisateur ait cliqué sur la croix dans la barre de titre dans le formulaire principal, il y aurait une invite demandant à l’utilisateur "Ceci fermera l’application. Confirmez?" Suivi de oui et pas de bouton.

Si oui, une autre boîte sera affichée, "Application fermée!"

Si non, la boîte de message sera simplement fermée et l'application continuera à s'exécuter.

Mon code actuel est:

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

cependant cela ne fonctionne pas.

Premièrement, je ne sais pas pourquoi la boîte de message apparaît deux fois pour que tout soit fermé.

Deuxièmement, si je clique sur non, le formulaire se ferme également et je ne parviens pas à le ramener.

19
Thomas

Pour annuler la fermeture du formulaire, vous avez besoin de e.Cancel = true;..__ dans votre instruction else. Vous n'avez pas besoin de la sortie explicite dans votre cas réel.

Essayez ceci

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

Je suppose que votre deuxième MessageBox indique qu'il a été fermé uniquement à des fins de test.

Vous voulez probablement seulement. 

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

Remarquez que l'énoncé vérifie s'ils n'ont pas appuyé sur Oui plutôt que sur Annuler. Cela signifie que s'ils appuient sur le x de la boîte de dialogue, cela ne sera pas considéré comme une confirmation.

EDIT: Si mainForm n'est pas la forme principale

Ok, je pense avoir ce que vous demandez maintenant.

Ce que je voudrais faire est de mettre le code que j'ai dans mon deuxième bloc de code ci-dessus dans FormClosing, puis dans le gestionnaire d'événements 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();
}
30
Ray

Cela devrait vous aider

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

Vous devriez regarder Annuler la propriété dans FormClosingEventArgs: Cela devrait fonctionner:

  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
Kamil Lach

Cela fera ce dont vous avez besoin:

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

Edit: pour répondre à votre première question, voir this . Lorsque vous appelez Exit() dans votre application, un événement FormClosing est généré pour tous les formulaires ouverts, y compris mainForm (qui est toujours ouvert), de sorte que l'événement est déclenché deux fois. Normalement, je m'attendrais à ce que quelque chose comme cela aboutisse à une récursion infinie et à un débordement de pile littéral, mais je suppose que .NET est suffisamment intelligent pour empêcher cela.

Sur une note connexe, vous ne devriez vraiment jamais fermer votre programme en appelant Exit() - c'est une sorte d'odeur de code.

1
MusiGenesis

Pour obtenir la fonctionnalité désirée, essayez plutôt ce code:

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
Kevin McCormick
var GetInput = MessageBox.Show("Do you want to Delete?", "Confirm Deletion",MessageBoxButton.OKCancel);

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

votre code fonctionne parfaitement pour moi sans erreur.

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
Hasan Alosta