2009-12-28 9 views
13

Quiero establecer CloseReason de un formulario después de llamar a This.Close() dentro del formulario.Configuración programmatically closereason

Normalmente, este formulario se cierra solo llamando a This.Close(), pero quiero preguntarle al usuario si REALMENTE quiere cerrar el formulario y enviar un mbox con cierta información. Pero tengo esto:

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

Pero cada vez que llamo This.Close(); el CloseReason siempre es UserClosing.

¿Puedo configurarlo después de la llamada o tengo que manejar el OnFormClosing diferente?

+0

BTW: El MessageBox.show() está incompleto porque lo escribí aquí, no en VS – josecortesp

+1

También he encontrado que el CloseReason para llamar a Form.Close() parece ser siempre UserClosing. Esto es un poco tonto ya que UserClosing realmente debería surgir cuando el usuario presiona el botón de cerrar, selecciona cerrar desde el menú del sistema, o Alt + F4 es la forma. –

Respuesta

10

No creo que se puede hacer eso, lo que siempre hago es usar una bandera

appClosing = true; 
this.Close(); 

Y a continuación, comprobar si hay que:

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

Parece que es la única opción ... Está funcionando ahora como yo quería, así que lo mantendré así ... ¡Gracias! – josecortesp

5

CloseReason es una enumeración con el siguiente miembros:

None 
WindowsShutDown 
MdiFormClosing 
UserClosing 
TaskManagerClosing 
FormOwnerClosing 
ApplicationExitCall 

Lo que me lleva a creer que depende de las condiciones relacionadas con el comportamiento de las formas en general (ej. al cerrar un formulario principal, se cierra su hijo). Por lo tanto, para que arg pueda decir, CloseReason.ApplicationExitCall, el evento se debe desencadenar desde una llamada Application.Exit.

mismo con un CloseReason.FormOwnerClosing decir, asumiendo que su niño formas se denominan utilizando form.Show (Padre)

Si su objetivo es simplemente tener información adicional de qué forma se está cerrando, simplemente puede almacenarlo dentro del objeto de formulario como un atributo público o propiedad para acceder a él más tarde, suponiendo que dicho formulario no fue eliminado.

Proporcionar cuál fue su motivación para cambiar el CloseReason probablemente también lo ayude.

página

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

11

En lugar de crear la variable adicional:

appClosing = true; 
this.Close(); 

Usted puede llamar a:

Application.Exit(); 

Y luego e.CloseReason será igual

CloseReason.ApplicationExitCall 

Que podría ser lo que buscas.

+0

¡Agradable, gracias! Lástima que este proyecto ya esté terminado (Fue para un trabajo de la Universidad). Pero es realmente bueno saber – josecortesp

6

La forma en que he comenzado a hacer esto es establecer la propiedad DialogResult del formulario para diferentes cosas en función de lo que el usuario ha hecho clic en el formulario.

En su botón de método de clic:

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

De esta manera usted puede hacer lo siguiente en los métodos 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; 
    } 
} 

En cuanto a la CloseReason siempre se establece en UserClosing, se establece a este valor por cualquier acción que un usuario pueda iniciar, no puedo recordar exactamente qué, pero estoy bastante seguro de que incluso un administrador de tareas matar es el cierre del usuario. Sin embargo, puedo confirmar que los otros valores enumerados se configuran en varios casos, como un apagado/reinicio mientras la aplicación todavía se está ejecutando. Incluso puede detener el cierre de Windows capturando TODAS las razones cercanas en el interruptor y cancelando el cierre.

+0

Probablemente la mejor respuesta. Cuando se trata de Cancelación o salida forzada, el código de cierre usaría algo como: e.Cancel = this.DialogResult! = DialogResult.Cancel && 'other domain conditions'; – dmihailescu

+0

Brillante. ¡Gracias! –