2011-10-31 2 views
18

Actualmente estoy desarrollando una aplicación de formulario de Windows C#.¿Cómo se muestra un mensaje en MessageBox cuando el usuario ha hecho clic en la cruz en la barra de título?

Después de que el usuario inicie sesión a través del loginForm, se llevará al mainForm.

Me gustaría codificarlo de manera que después de que el usuario haga clic en la cruz en la barra de título en el archivo mainForm, se le preguntará al usuario "Esto cerrará la aplicación. ¿Confirmar?" seguido de un botón sí y no.

En caso afirmativo, se mostrará otro cuadro, "¡Aplicación cerrada!"

De lo contrario, el cuadro de mensaje se cerrará y la aplicación continuará ejecutándose.

Mi código actual es:

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

sin embargo, no funciona.

En primer lugar, no tengo idea de por qué el cuadro de mensaje aparece dos veces para que todo se cierre.

En segundo lugar, si hago clic en no, el formulario también se cierra y no puedo recuperarlo.

Respuesta

30

Para cancelar el cierre de la forma, en su estado de cuenta más que necesita e.Cancel = true;. No necesita la salida explícita en su caso real.

seguirlo

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

Asumo el segundo cuadro de mensaje para decir que si se ha cerrado para propósitos de prueba.

Probablemente solo desee.

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

Observe que la declaración comprueba si no presionaron sí, en lugar de si presionan cancelar. Esto significa que si presionan la x en el cuadro de diálogo no se contará como una confirmación.

EDIT: Si mainForm no es la forma principal

bien, creo que tengo lo que está pidiendo ahora.

Lo que quiero hacer es poner el código que tengo en mi segundo bloque de código anterior en el FormClosing, y luego en el controlador de eventos FormClosed tienen esta

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

hola gracias por su respuesta. funciona pero no totalmente el resultado que yo quería. la razón por la que codifiqué en System.Windows.Forms.Application.Exit(); es porque quería que terminara toda la aplicación. no solo esa forma en sí misma, ya que no es la forma principal y tengo una forma múltiple. Entonces, ¿cómo hago para hacer eso? – Thomas

+0

Oh, el mainForm no es la forma principal ?. De acuerdo, solo agrega la llamada de salida al caso verdadero. – Ray

+0

hola, lo siento. todavía bastante inseguro sobre esto. ¿Qué quieres decir con eso? – Thomas

1

Usted debe mirar a la propiedad Cancel en FormClosingEventArgs: Esto debería funcionar:

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

hola lo siento pero no entendí lo que está tratando de decir. ¿Dónde está la parte que llamé dos veces? – Thomas

+0

No debería necesitar la llamada 'Exit()' aquí, ya que la aplicación se cerrará de todos modos. – MusiGenesis

+0

Tienes razón, soluciono la respuesta. –

2

Esto debería ayudarle a

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

Esto va a hacer lo que necesita:

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

Editar: para responder a su primera pregunta, vea this. Cuando llama al Exit() en su aplicación, se genera un evento FormClosing para todos los formularios abiertos, incluido mainForm (que aún está abierto), por lo que el evento se levanta dos veces. Normalmente, esperaría que algo como esto produjera una recursión infinita y un desbordamiento literal de la pila, pero asumo que .NET es lo suficientemente inteligente como para evitar esto.

En una nota relacionada, realmente nunca debería tener su programa cerrado llamando al Exit() - es como un olor a código.

1

para obtener la funcionalidad deseada, prueba este código en su lugar:

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

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

el código funciona perfectamente para mí sin errores.

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