2009-12-28 17 views
13

Desidero impostare il CloseReason di un modulo dopo aver chiamato This.Close() all'interno del modulo.Impostazione a programmazione inferiore.

Di solito, questo forma è chiuso da solo chiamando This.Close(), ma voglio chiedere all'utente se davvero vogliono chiudere il modulo, e inviare un mbox con alcune informazioni. Ma ho questo:

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.UserClosing) 
     { 
      if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No) 
      { 
       e.Cancel = true; 
      } 
     } 
     base.OnFormClosing(e); 
    } 

Ma ogni volta chiamo This.Close(); il CloseReason è sempre UserClosing.

Posso impostarlo dopo la chiamata o devo gestire OnFormClosing diverso?

+0

BTW: Il MessageBox.show() è incompleta perché l'ho scritto qui, non in VS – josecortesp

+1

Ho anche scoperto che la CloseReason per chiamare Form.Close() sembra essere sempre UserClosing. Questo è un po 'sciocco dal momento che UserClosing dovrebbe davvero sorgere solo quando l'utente preme il pulsante di chiusura, seleziona chiudi dal menu di sistema o Alt + F4 è il modulo. –

risposta

10

Non credo che si può fare, quello che faccio sempre è quello di utilizzare una bandiera

appClosing = true; 
this.Close(); 

E poi controllare che:

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.UserClosing && !appClosing) 
     { 
      if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No) 
      { 
       e.Cancel = true; 
      } 
     } 
     base.OnFormClosing(e); 
    } 
+0

Sembra che sia l'unica opzione ... Funziona ora come volevo, così continuerò così ... Grazie! – josecortesp

5

CloseReason è un enum con il seguente membri:

None 
WindowsShutDown 
MdiFormClosing 
UserClosing 
TaskManagerClosing 
FormOwnerClosing 
ApplicationExitCall 

il che mi porta a credere che esso dipende dalle condizioni relative al comportamento delle forme in generale (Es. chiudere un modulo genitore chiude i suoi childs). Quindi, per fare in modo che arg abbia scritto, CloseReason.ApplicationExitCall, l'evento deve essere attivato da una chiamata Application.Exit.

Stessa cosa con diciamo un CloseReason.FormOwnerClosing, supponendo che il form figlio sono chiamati usando form.Show (Parent)

Se il vostro obiettivo è quello di avere semplicemente informazioni aggiuntive del motivo per cui la forma si sta chiudendo, si può semplicemente memorizzare all'interno dell'oggetto form come attributo pubblico o proprietà per accedervi successivamente, supponendo che tale modulo non sia stato disposto.

Fornire quale sia stata la vostra motivazione nel cambiare il CloseReason sarebbe probabilmente d'aiuto.

pagina

CloseReason MSDN per riferimento http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx

11

Piuttosto che creare la variabile in più:

appClosing = true; 
this.Close(); 

È possibile chiamare:

Application.Exit(); 

E poi e.CloseReason sarà uguale

CloseReason.ApplicationExitCall 

Quale potrebbe essere quello che stai cercando.

+0

Bello, grazie! Peccato che questo progetto sia già finito (era per un lavoro universitario). Ma è davvero bello sapere – josecortesp

6

Il modo in cui ho iniziato a farlo è impostare la proprietà DialogResult del modulo su elementi diversi in base a ciò che l'utente ha fatto clic sul modulo.

Nel vostro pulsante metodo click:

private void FillOrder_Click(object sender, EventArgs e) 
{ 
    this.DialogResult = DialogResult.OK; 
    // this.Close() is called automatically when you set DialogResult 
    // so the above line will close the form as well. 
} 

In questo modo è possibile effettuare le seguenti nei metodi FormClosing:

private void Form_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    switch (e.CloseReason) 
    { 
     case CloseReason.UserClosing: 
      switch (this.DialogResult) 
      { 
       case DialogResult.OK: 
        // User has clicked button. 
        break; 
       case DialogResult.Cancel: 
        // User has clicked X on form, show your yes/no/cancel box here. 

        // Set cancel here to prevent the closing. 
        //e.Cancel = true; 
        break; 
      } 
      break; 
    } 
} 

Per quanto riguarda la CloseReason sempre essere impostato su UserClosing, è impostato a questo valore da qualsiasi azione che un utente può avviare, non è in grado di ricordare esattamente cosa, ma sono abbastanza sicuro che anche un kill di forza del task manager è la chiusura dell'utente. Tuttavia, posso confermare che gli altri valori enum sono impostati in vari casi, ad esempio un arresto/riavvio mentre l'app è ancora in esecuzione. È anche possibile interrompere l'arresto di Windows catturando TUTTI i motivi di chiusura dell'interruttore e annullando la chiusura.

+0

Probabilmente la migliore risposta. Quando si ha a che fare con l'annullamento o l'uscita forzata, il codice di chiusura usa qualcosa come: e.Cancel = this.DialogResult! = DialogResult.Cancel && 'other domain conditions'; – dmihailescu

+0

Brillante. Grazie! –

Problemi correlati