índice de Visual Studio 2005 y .NET Framework 2.0 Trucos .NET 2.0

Saber si se cierra el formulario pulsando en la "x"


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.

 
Publicado: 17/Ene/2006
Actualizado: 17/Ene/2006
Autor: Guillermo 'guille' Som
Pulsa para votar este artículo en Panorama Box


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:

 

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

 


Trucos .NET 2.0

la Luna del Guille o... el Guille que está en la Luna... tanto monta...