COMO USAR LA CLASE?
1. Hay que declarar lo siguiente: Dim m_TextBox1 As ArrayControles(Of TextBox)
2. Instanciar la clase: m_TextBox1 = New ArrayControles(Of TextBox)(“datos”, Me)
Donde el valor “datos” que se le pasa al constructor es el prefijo de todos vuestros controles(textbox en este caso).
Es importante que los controles tengan la siguiente estructura:
datos_00, datos_01…etc
La clase extraera el numero para saber con cual esta tratando, ese es su index vaya.
El nombre es indiferente, pero al llamar al constructor tienes que pasarle el nombre que le hayas puesto.
Para hacer el array con otro tipo de elementos solo hay que indicar en (Of TextBox) cual es el tipo de elementos. Ejemplo:
Private m_Label1 As ArrayControles(Of Label)
Private m_TextBox1 As ArrayControles(Of TextBox)
Private m_RadioButton1 As ArrayControles(Of RadioButton)
EJEMPLO SENZILLO
Creas tres textbox en tu formulario y le pones de nombre: txtCampo_00, txtCampo_01, txtCampo_02.
Despues creas un boton y en su evento click colocas lo siguiente:
Dim m_TextBox1 As ArrayControles(Of TextBox)Dim i As Integer
i = 0
m_TextBox1 = New ArrayControles(Of TextBox)(“txtCampo”, Me)For i = 0 To 2m_TextBox1(i).Text = “Este es el campo de texto numero ” & i
Next
CLASSE A UTILIZAR
Option Strict OnImports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Windows.Forms
Imports System.Drawing Public Class ArrayControles(Of T As Control)Inherits System.Collections.Generic.List(Of T)Private m_Nombre As String
”’ <summary>
”’ En el constructor se debe indicar el nombre del control.
”’ </summary>
”’ <param name=”elNombre”>
”’ El nombre base de los controles del array,
”’ esos controles deben tener el nombre: elNombre_numero.
”’ No se admite una cadena vacía.
”’ </param>
”’ <remarks></remarks>
Public Sub New(ByVal elNombre As String)MyBase.New()If String.IsNullOrEmpty(elNombre) Then
Throw New ArgumentException( _“El nombre del control no puede ser una cadena vacía”)End If
‘ Asignarlo a la propiedad
‘ para que se convierta en minúsculas
‘ o cualquier otra comprobación.
Me.Nombre = elNombreEnd Sub
”’ <summary>
”’ Constructor para inicializar directamente la colección de controles
”’ </summary>
”’ <param name=”ctrls”>
”’ Colección de controles en la que están los que debemos usar.
”’ </param>
”’ <param name=”elNombre”>
”’ El nombre base de los controles a tener en cuenta.
”’ </param>
”’ <remarks></remarks>
Public Sub New( _ByVal elNombre As String, _
ByVal ctrls As Control.ControlCollection)Me.New(elNombre)
Me.Clear()asignarLosControles(ctrls)
Me.Reorganizar()End Sub
”’ <summary>
”’ Constructor para inicializar directamente la colección de controles
”’ </summary>
”’ <param name=”contenedor”>
”’ El contenedor que tiene los controles a comprobar.
”’ </param>
”’ <param name=”elNombre”>
”’ El nombre base de los controles a tener en cuenta.
”’ </param>
”’ <remarks></remarks>
Public Sub New( _ByVal elNombre As String, _
ByVal contenedor As ContainerControl)Me.New(elNombre, contenedor.Controls)End Sub
”’ <summary>
”’ Asignar los controles de la colección indicada.
”’ </summary>
”’ <param name=”ctrls”>
”’ Colección de controles en la que están los que debemos usar.
”’ El nombre usado será el indicado al crear la colección.
”’ </param>
”’ <remarks>
”’ La colección de controles puede ser Me.Controls
”’ ya que aquí solo se tendrán en cuenta los controles
”’ que tengan el nombre usado en esta clase,
”’ y se recorren todas las colecciones de controles que haya.
”’ </remarks>
Public Sub AsignarControles(ByVal ctrls As Control.ControlCollection)Me.Clear()asignarLosControles(ctrls)
Me.Reorganizar()End Sub
”’ <summary>
”’ Asignar los controles del contenedor indicado.
”’ </summary>
”’ <param name=”contenedor”>
”’ El contenedor de los controles en los que se buscarán
”’ los del tipo indicado en esta colección.
”’ </param>
”’ <remarks></remarks>
Public Sub AsignarControles(ByVal contenedor As ContainerControl)Me.Clear()asignarLosControles(contenedor.Controls)
Me.Reorganizar()End Sub
Private Sub asignarLosControles(ByVal ctrls As Control.ControlCollection)‘ El tipo debe ser Control, para tener en cuenta todos los controles
‘ que haya en la colección indicada.
For Each ctr As Control In ctrls‘ Hacer una llamada recursiva por si este control “contiene” otros
If ctr.Controls.Count > 0 Then
asignarLosControles(ctr.Controls)
End If
If ctr.Name.ToLower().IndexOf(m_Nombre) > -1 Then
Me.Add(TryCast(ctr, T))End If
Next
End Sub
‘ Sobrecargas de la propiedad predeterminada (Item)
”’ <summary>
”’ Propiedad predeterminada para devolver
”’ el control con el nombre indicado.
”’ </summary>
”’ <param name=”name”>
”’ El nombre del control a buscar.
”’ </param>
”’ <value></value>
”’ <returns>
”’ El control que tiene el nombre indicado.
”’ </returns>
”’ <remarks></remarks>
Default Public Overloads ReadOnly Property Item(ByVal name As String) As TGet
Dim index As Integer = Me.Index(name)‘ Si existe, devolverlo, sino, devolver un valor nulo
If index = -1 Then
Return Nothing
End If
Return Me(index)End Get
End Property
”’ <summary>
”’ Sobrecarga de la propiedad predeterminada
”’ para permitir el acceso con un valor de tipo Object.
”’ Aunque el tipo debe ser del que contiene la colección,
”’ si no es así, se devuelve un valor nulo.
”’ </summary>
”’ <param name=”obj”>
”’ El control a comprobar
”’ </param>
”’ <value></value>
”’ <returns>
”’ Si el parámetro es del tipo adecuado,
”’ se devuelve con el tipo de la colección,
”’ si no lo es, se devuelve un valor nulo.
”’ </returns>
”’ <remarks></remarks>
Default Public Overloads ReadOnly Property Item(ByVal obj As Object) As TGet
Dim ctrl As T = TryCast(obj, T)Return ctrl‘ Quita estos comentarios y comenta el Return anterior
‘ si quieres que se compruebe exactamente el control.
” Buscar ese control en la colección,
” para asegurarnos de que en realidad está.
‘If ctrl Is Nothing Then
‘ Return Nothing
‘End If
‘For Each c As T In Me
‘ If c Is ctrl Then
‘ Return c
‘ End If
‘Next
‘Return Nothing
End Get
End Property
”’ <summary>
”’ Devuelve el índice del control de esta colección
”’ que tenga el mismo índice que el del parámetro.
”’ Ese parámetro puede ser cualquier control,
”’ y lo que se tendrá en cuenta será el nombre usado,
”’ el cual debe tener la forma nombre_indice,
”’ de forma que se devolverá el control que tenga ese mismo índice.
”’ </summary>
”’ <param name=”obj”>
”’ El control a comprobar si existe un índice como el indicado.
”’ Al ser de tipo Object no es necesario que sea del mismo tipo
”’ que los que contiene esta colección.
”’ </param>
”’ <returns>
”’ El índice correspondiente.
”’ Aunque no se comprueba si existe en la colección.
”’ En el caso de que el parámetro no tenga el formato adecuado,
”’ se devuelve -1.
”’ </returns>
”’ <remarks>
”’ Esta sobrecarga se puede usar para buscar el control correspondiente
”’ con el del índice de otro control, por ejemplo:
”’ i = m_TextBox1.Index(sender)
”’ Por supuesto, el parámetro debe ser de tipo Control.
”’ Este método podría estar compartido, pero debido a que su uso
”’ sería ArrayControles(Of TIPO).Index(sender)
”’ he preferido dejarlo como de instancia.
”’ </remarks>
Public Function Index(ByVal obj As Object) As Integer
Dim ctrl As Control = TryCast(obj, Control)If ctrl Is Nothing Then
Return -1End If
Dim i As Integer = -1i = ctrl.Name.LastIndexOf(“_”)If i > -1 Then
i = CInt(ctrl.Name.Substring(i + 1))End If
Return iEnd Function
”’ <summary>
”’ Devuelve el índice del control con el nombre indicado.
”’ </summary>
”’ <param name=”name”>
”’ Nombre del control a buscar en la colección.
”’ </param>
”’ <returns>
”’ Un valor de tipo entero con el índice del control.
”’ </returns>
”’ <remarks></remarks>
Public Function Index(ByVal name As String) As Integer
Dim hallado As Integer = -1For i As Integer = 0 To Me.Count – 1
Dim ctrl As T = Me(i)If String.Compare(ctrl.Name, name, True) = 0 Then
hallado = i
Exit For
End If
Next
Return halladoEnd Function
”’ <summary>
”’ Devuelve el índice del control indicado.
”’ </summary>
”’ <param name=”ctrl”>
”’ El control del que queremos averiguar el índice.
”’ </param>
”’ <returns>
”’ Un valor de tipo entero con el índice del control.
”’ </returns>
”’ <remarks></remarks>
Public Function Index(ByVal ctrl As T) As Integer
Dim i As Integer = ctrl.Name.LastIndexOf(“_”)‘ Si el nombre no tiene el signo _
If i = -1 Then
i = Me.IndexOf(ctrl)Else
i = CInt(ctrl.Name.Substring(i + 1))End If
Return iEnd Function
‘
”’ <summary>
”’ La propiedad Nombre, externamente será de solo lectura.
”’ </summary>
”’ <value>El nombre de la colección de controles</value>
”’ <returns>
”’ El nombre de la colección de controles.
”’ </returns>
”’ <remarks>
”’ </remarks>
Public Property Nombre() As String
Get
Return m_NombreEnd Get
Private Set(ByVal value As String)m_Nombre = value.ToLower()
End Set
End Property
‘
”’ <summary>
”’ Reorganizar el contenido de la colección,
”’ ordenando por el índice indicado después del guión bajo
”’ </summary>
”’ <remarks></remarks>
Public Sub Reorganizar()Dim ca As New List(Of T)
For i As Integer = 0 To Me.Count – 1For Each ctr As T In Me
If i = Me.Index(ctr) Then
ca.Add(ctr)
Exit For
End If
Next
Next
‘
Me.Clear()For Each ctr As T In ca
Me.Add(ctr)Next
End SubEnd Class
DOCUMENTACION
http://www.elguille.info/NET/vs2005/como/array_controles_visual_basic_2005.htm
Yoff escribió
He probado con este codigo pero no puedo trabajar con los 49 checkboxs que tengo ya no se que hacer si alguien puede ayudarme se lo agradeceria….contactenme a elradical22@gmail.com
lokoeef escribió
hey q onda no manches quita el color se ve pardo
y el codifo no le entiendoi
Reinaldo escribió
Hola, la información esta muy buena… Pero la combinación de colores que usas no es la adecuada, te recomendaria, que por lo menos para los textos, uses colores màs claros para que contrasten con el negro de fondo. Resulta bastante incomodo leer código (o cualquier contenido) en estas condiciones, esto resta interés a la página y por supuesto visitas. Y repito, la información vale la pena. Gracias
jamacuco escribió
Vengo de VB6, y en los controles habia una propiedad INDEX , ahora me tengo que dejar las uñas escribiendo todo este codigo para poder crear un array de controles… es increible, vamos patrás…
Saludos.