2009-10-26 11 views
25

¿Cómo puedo detectar cómo se cierra un formulario de Windows? Por ejemplo, ¿cómo puedo saber si el usuario ha hecho clic en un botón que cierra el formulario o si el usuario hace clic en la "X" en la esquina superior derecha? Gracias.Detectar el motivo para cerrar el formulario

Actualización:

olvidó mencionar que el botón llama al método Application.Exit().

Respuesta

35

Como bashmohandes y Dmitriy Matveev ya se ha mencionado, la solución debe ser el FormClosingEventArgs. Pero como Dmitriy también dijo, esto no haría ninguna diferencia entre tu botón y la X en la esquina superior derecha.

Para distinguir entre estas dos opciones, se puede añadir una propiedad booleana ExitButtonClicked a su forma y configurarlo para cierto en el botón Click-Evento derecha antes de llamar Application.Exit().

Ahora puede solicitar esta propiedad dentro del evento FormClosing y distinguir entre esas dos opciones dentro del caso UserClosing.

Ejemplo:

public bool UserClosing { get; set; } 

    public FormMain() 
    { 
     InitializeComponent(); 

     UserClosing = false; 
     this.buttonExit.Click += new EventHandler(buttonExit_Click); 
     this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 
    } 

    void buttonExit_Click(object sender, EventArgs e) 
    { 
     UserClosing = true; 
     this.Close(); 
    } 

    void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     switch (e.CloseReason) 
     { 
      case CloseReason.ApplicationExitCall: 
       break; 
      case CloseReason.FormOwnerClosing: 
       break; 
      case CloseReason.MdiFormClosing: 
       break; 
      case CloseReason.None: 
       break; 
      case CloseReason.TaskManagerClosing: 
       break; 
      case CloseReason.UserClosing: 
       if (UserClosing) 
       { 
        //what should happen if the user hitted the button? 
       } 
       else 
       { 
        //what should happen if the user hitted the x in the upper right corner? 
       } 
       break; 
      case CloseReason.WindowsShutDown: 
       break; 
      default: 
       break; 
     } 

     // Set it back to false, just for the case e.Cancel was set to true 
     // and the closing was aborted. 
     UserClosing = false; 
    } 
+2

Oliver, tienes un grave error ahora. Si llama a Application.Exit desde el controlador de clics cuando el motivo cercano será CloseReason.ApplicationExitCall y la condición (UserClosing) será inútil. Debe llamar a este método .Close() en el controlador de clic para que coincida con el caso del conmutador UserClosing o si necesita mover la instrucción if al exterior de la instrucción switch. – okutane

+0

Si alguna vez el formulario no está cerrado una vez que está en Form1_FormClosing, quizás haya un "¿quiso salir?" pregunta: algo necesita establecer la variable del indicador UserClosing en false o la próxima vez que sea falso. –

4

Puede verificar la propiedad CloseReason de FormClosingEventArgs en FormClosing event handler para verificar algunos de los casos posibles. Sin embargo, los casos descritos por usted serán indistinguibles si solo usará esta propiedad. Tendrá que escribir un código adicional en el controlador de eventos click de su botón "cerrar" para almacenar cierta información que se comprobará en el controlador de eventos FormClosing para distinguir entre estos casos.

0

Es necesario añadir un oyente a la Incluso FormClosing, que envía en caso ARGS una propiedad de tipo CloseReason que es uno de estos valores

// Summary: 
//  Specifies the reason that a form was closed. 
public enum CloseReason 
{ 
    // Summary: 
    //  The cause of the closure was not defined or could not be determined. 
    None = 0, 
    // 
    // Summary: 
    //  The operating system is closing all applications before shutting down. 
    WindowsShutDown = 1, 
    // 
    // Summary: 
    //  The parent form of this multiple document interface (MDI) form is closing. 
    MdiFormClosing = 2, 
    // 
    // Summary: 
    //  The user is closing the form through the user interface (UI), for example 
    //  by clicking the Close button on the form window, selecting Close from the 
    //  window's control menu, or pressing ALT+F4. 
    UserClosing = 3, 
    // 
    // Summary: 
    //  The Microsoft Windows Task Manager is closing the application. 
    TaskManagerClosing = 4, 
    // 
    // Summary: 
    //  The owner form is closing. 
    FormOwnerClosing = 5, 
    // 
    // Summary: 
    //  The System.Windows.Forms.Application.Exit() method of the System.Windows.Forms.Application 
    //  class was invoked. 
    ApplicationExitCall = 6, 
} 
+1

Ambos casos descritos por Nate será CloseReason.UserClosing, así que ¿cómo el uso de esta propiedad le puede ayudar? – okutane

Cuestiones relacionadas