Archivo

Archive for the ‘VB.NET’ Category

Cómo abrir un formulario y cerrar el padre en VB.NET


Casi nunca escribo cosas de VB.NET, puesto que mi lenguaje preferido en .NET es C#. Sin embargo, hoy surgió una discusión en los foros de MSDN, y creo que es algo recurrente, así que mejor hago esta pequeña entrada.

El asunto es el siguiente. Supongamos que tengo Form1 y Form2, dos formas. Al iniciar la aplicación, inicio Form1 y quiero que al hacer clic a un botón dentro de ésta, me abra Form2.

La primera aproximacion es hacer un ShowDialog:

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
        Handles Button1.Click

        Dim form As New Form2

        form.ShowDialog(Me)
        
    End Sub
End Class

Esto muestra la segunda forma como modal de la primera. Si quisiéramos cerrar la forma original (i.e. Form1) podríamos hacer un close:

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
        Handles Button1.Click

        Dim form As New Form2

        form.ShowDialog(Me)
        Me.Close()
        
    End Sub
End Class

Pero no nos sirve, porque Close no se ejecutará hasta que ShowDialog termine, es decir, hastas que Form2 se cierre. Lo que podemos hacer es invocar a Show, en lugar de a ShowDialog.

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
        Handles Button1.Click

        Dim form As New Form2

        form.Show()
        Me.Close()
        
    End Sub
End Class

Así, Close se ejecuta inmediatamente después de Show. Sin embargo, si haces esto ahora nos damos cuenta que al hacer clic en el botón, sí se abre momentáneamente el Form2, pero ¡se cierra la aplicación!

Había escuchado muchos argumentos de que esto era por diseño, que la forma inicial siempre debía estar corriendo, etc. Me puse a picarle al código y encontré que en las propiedades del proyecto es posible especificar la forma en la que una aplicación VB termina: si queremos que termine cuando se cierra el formulario principal o si queremos que termine cuando se cierre el último formulario.

image

Una vez que cambiamos la opción a “Cerrar cuando se cierre el último formulario” ¡el código anterior funciona a la perfección!

Tras bambalinas pude ver que el diseñador de VB.NET 2010 genera una clase llamada MyApplication, la cual tiene una propiedad: ShutdownStyle, de tipo ShutdownMode, así que las propiedades del proyecto seguramente sólo cambian ese valor.

Y dado que la documentación data de .NET Framework 2.0, supongo que esta funcionalidad está disponible desde entonces (circa 2005).

Así que ya sabes: ¡haz la prueba y deja tus comentarios!