2009-10-26 12 views
25

Come posso rilevare come viene chiuso un modulo di Windows? Ad esempio, come faccio a sapere se l'utente ha fatto clic su un pulsante che chiude il modulo o se l'utente fa clic su "X" in alto a destra? Grazie.Rileva il motivo della chiusura del modulo

Aggiornamento:

dimenticato di dire che il pulsante chiama il metodo Application.Exit().

risposta

35

Come bashmohandes e Dmitriy Matveev già accennato la soluzione deve essere il FormClosingEventArgs. Ma come Dmitriy ha anche detto, questo non farebbe alcuna differenza tra il tuo pulsante e la X nell'angolo in alto a destra.

Per distinguere tra queste due opzioni, è possibile aggiungere una proprietà booleana ExitButtonClicked al form e impostarlo su true nel pulsante Click-evento prima di chiamare Application.Exit().

Ora è possibile richiedere questa proprietà all'interno dell'evento FormClosing e distinguere tra queste due opzioni all'interno del caso UserClosing.

Esempio:

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, hai un grave errore ora. Se chiami Application.Exit dal gestore di clic quando il motivo di chiusura sarà CloseReason.ApplicationExitCall e se la condizione (UserClosing) sarà inutile. Dovresti chiamare questo metodo.Close() nel gestore di clic per far corrispondere il caso Switch di UserClosing o devi spostare l'istruzione all'esterno dell'istruzione switch. – okutane

+0

Se il modulo non viene mai chiuso una volta che ti trovi in ​​Form1_FormClosing, forse c'è "hai intenzione di uscire?" domanda: qualcosa deve impostare la variabile flag UserClosing su false o la prossima volta che potrebbe falsamente essere true. –

4

È possibile controllare CloseReason proprietà di FormClosingEventArgs in gestore di eventi FormClosing per controllare alcune delle possibili casi. Tuttavia, i casi descritti da te saranno indistinguibili se utilizzerai questa proprietà. Dovrai scrivere del codice aggiuntivo nel gestore di eventi click del tuo pulsante "chiudi" per memorizzare alcune informazioni che verranno verificate nel gestore di eventi FormClosing per distinguere tra questi casi.

0

È necessario aggiungere un listener al Persino FormClosing, che invia in caso args una proprietà di tipo CloseReason che è uno di questi valori

// 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

In entrambi i casi descritti da Nate sarà CloseReason.UserClosing, così come l'utilizzo di questa proprietà può aiutarlo? – okutane

Problemi correlati