En este ejemplo veremos cómo comprobar si nuestro formulario se cierra porque el usuario ha pulsado en la "x" de la ventana o ha elegido cerrarlo desde el menú de control (el que está en la parte izquierda del título de la ventana). Este código es válido para la versión 2.0 de .NET Framework (Visual Studio 2005), si quieres ver la versión para Visual Studio 2003/2002 y .NET v1.x, sigue este link.
|
|
Introducción
En este ejemplo veremos cómo comprobar si nuestro formulario se cierra porque el usuario ha pulsado en la "x" de la ventana o ha elegido cerrarlo desde el menú de control (el que está en la parte izquierda del título de la ventana). Este código es válido para la versión 2.0 de .NET Framework (Visual Studio 2005), si quieres ver la versión para Visual Studio 2003/2002 y .NET v1.x, sigue este link.
En la versión 2.0 de .NET Framework se ha añadido un nuevo evento al formulario (realmente se han añadido varios) que nos permite saber porqué se está cerrando nuestra aplicación, (en VB6 ya existía esa posibilidad).
La forma de detectarlo en el evento FormClosing, (también se puede desde FormClosed, pero este último no es recomendable, ya que se produce una vez que el formulario se ha cerrado, mientras que el otro se produce antes de que se cierre el formulario y por tanto podemos cancelar dicho cierre), y mediante la propiedad CloseReason del segundo parámetro del evento.
Esa propiedad puede tomar varios valores, según sea el motivo por el que se cierra el formulario.
Los valores posibles (enumeración CloseReason) son:
- ApplicationExitCall, se cierra por medio de una llamada a Application.Exit()
- FormOwnerClosing, se cierra desde el form propietario
- MdiFormClosing, el form MDI de este formulario se está cerrando
- None, se cierra por causas desconocidas (¡sic!)
- TaskManagerClosing, se cierra desde el administrador de tareas de Windows
- UserClosing, se cierra desde código llamando a Close o porque el usuario lo cierra desde la x o el menú de control
- WindowsShutDown, se cierra porque Windows se está cerrando
Nota:
Lo que debemos saber es que el valor UserClosing se produce incluso si nosotros cerramos el formulario por medio de código usando el método Close() del formulario.
Aquí tienes el código de ejemplo para Visual Basic y C# (recuerda que solo para la versión 2005 y superior):
Código de VB2005:
Private Sub btnClose_Click( _ ByVal sender As Object, ByVal e As EventArgs) _ Handles btnClose.Click ' Esto producirá un valor de UserClosing en FormClosing Me.Close() End Sub Private Sub btnExit_Click( _ ByVal sender As Object, ByVal e As EventArgs) _ Handles btnExit.Click ' Esto producirá un valor de ApplicationExitCall en FormClosing Application.Exit() End Sub Private Sub Form1_FormClosing( _ ByVal sender As Object, ByVal e As FormClosingEventArgs) _ Handles Me.FormClosing ' Mostrar un mensaje de porqué se está cerrando MessageBox.Show(e.CloseReason.ToString) ' Estos son los valores posibles Select Case e.CloseReason Case CloseReason.ApplicationExitCall Case CloseReason.FormOwnerClosing Case CloseReason.MdiFormClosing Case CloseReason.None Case CloseReason.TaskManagerClosing Case CloseReason.UserClosing Case CloseReason.WindowsShutDown End Select End Sub
Código de C# 2005:
private void btnClose_Click(object sender, EventArgs e) { // Esto producirá un valor de UserClosing en FormClosing this.Close(); } private void btnExit_Click(object sender, EventArgs e) { // Esto producirá un valor de ApplicationExitCall en FormClosing Application.Exit(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // Mostrar un mensaje de porqué se está cerrando MessageBox.Show(e.CloseReason.ToString()); // Estos son los valores posibles 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: break; case CloseReason.WindowsShutDown: break; } }
¡Que usted lo cierre bien!
Nos vemos.
Guillermo