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