miércoles, 17 de octubre de 2007

Mostrar y ocultar paneles en aplicaciones Winforms con VB.NET (o recorriendo colecciones de controles)

Cuando trabajamos con aplicaciones Windows solemos armar "ventanitas" con controles asociados a cierta funcionalidad de la aplicación.
En VB5 solía usar frames para est
o y tirabamos controles adentro de estos frames y lo mostrabamos u ocultabamos mediante la propiedad booleana 'visible'.
.NET nos ofrece varios controles para agrupar objetos. En este caso usaremos el control Panel.
la manera de mostrar u ocultar es la misma, mediante la propiedad 'visible' pero a medida que vamos agregando paneles cada vez que mostramos uno ten
emos que ocultar los demás y corremos el riesgo de que si lo hacemos uno por uno quizas en alguna parte nos olvidamos de ocultar alguno.
Para resolver esto aprovecharemos que los forms en .NET tienen una colección de los objetos que contienen y la vamos a recorrer para que no se nos saltee ningun panel.
Como ejemplo crearemos una aplicación winforms (en VS2005) donde dibujaremos el sgte. formulario:


Vemos que hay 3 paneles y tenemos 3 botones que muestran el panel 1, 2 o 3 solamente y en la parte inferior 2 botones que muestran u ocultan los 3 simultaneamente.


Para mostra y ocultar los paneles vamos a hacer un metodo que va a recorrer mediante un bucle For Each TODOS los controles del formulario y mediante un condicional verificamos si el control es de tipo 'Panel' en cuyo caso le asignamos a la propiedad visible el valor booleano que se recibe como paramentro (si este es 'true' mostramos y si es 'false' lo ocultamos).

El código del metodo es el sgte:

Private Sub paneles(ByVal visibilidad As Boolean)
'recorro todos los controles del formulario
For Each c As Control In Me.Controls
'si el control es de tipo Panel modifico su visibilidad segun el parametro
If TypeOf c Is Panel Then
c.Visible = visibilidad

End If
Next

End Sub

Luego en cada boton debo llamar al metodo 'paneles' y pasarle como parametros 'true' o 'false' segun corresponda, y de esta manera no tengo que preocuparme si sigo agregando paneles ya que este metodo recorre la coleccion completa de controles del formulario (o sea no se le va a pasar ninguno :) ).
Claro que en una aplicación real seguramente esto lo llame desde algun menú antes que de botones pero esto es solo un ejemplo. A propósito, vieron que interesante la manera de implementar menúes en VS2005? no? Bueno... esa la dejamos para la próxima entrada... :)
De yapa van el códifo (a continuación) y el proyecto en VB.NET para que lo puedan revisar (lo pueden bajar desde http://www.flr-si.com.ar/downloads/MostrarOcultarPaneles.zip ).

Código de la aplicación de ejemplo

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'al cargar el formulario llamo al metodo que para ocultar los paneles
paneles(False)
End Sub

Private Sub btnpanel1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnpanel1.Click
'en cada boton llamo al metodo para ocultar los paneles
'y hago visible el panel correspondiente
paneles(False)
Panel1.Visible = True
End Sub

Private Sub btnpanel2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnpanel2.Click
paneles(False)
Panel2.Visible = True
End Sub

Private Sub btnpanel3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnpanel3.Click
paneles(False)
Panel3.Visible = True
End Sub

Private Sub btnmostrartodos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnmostrartodos.Click
paneles(True)
End Sub

Private Sub btnocultartodos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnocultartodos.Click
paneles(False)
End Sub

Private Sub paneles(ByVal visibilidad As Boolean)
'recorro todos los controles del formulario
For Each c As Control In Me.Controls
'si el control es de tipo Panel modifico su visibilidad segun el parametro
If TypeOf c Is Panel Then
c.Visible = visibilidad
End If
Next
End Sub

End Class


No hay comentarios: