Acceso a propiedades de controles
en la colección Controls

Fecha: 19/Jul/2004 (17 de julio 2004)
Actualizado 21/Jul/2004
Autor: Javier Pelaez
Mail: javierpelaezt@hotmail.com

 


El siguiente código va en respuesta a una petición SOS de panorama Box, de Joan Carles Bayés:

Puedo utilizar una instrucción como esta para modificar las propiedades de un control:

foreach(System.Windows.Forms.Control control in this.tabPage01.Controls)
if(Object.ReferenceEquals(control.GetType(),this.textBox.GetType()))
{ ...... Como puedo referenciar la propiedad ReadOnly de un controle TextBox }

Si no se puede hacer, me gustaría hacer algo similar, sin referenciar directamente los controles (textBox.ReadOnly = true)

 

Si lo que se desea es modificar alguna propiedad de todos los controles de un determinado tipo (por ejemplo, todos los TextBox), puedes hacer lo siguiente:

Visual Basic

	Dim c As Control
	For Each c  In Me.TabPage1.Controls
		If c.GetType Is Me.txt1.GetType Then
			DirectCast(c, TextBox).ReadOnly = True
		End If
	Next

C#

	foreach (Control c in this.tabPage1.Controls)
	{
		if (c is TextBox)
		{
			((TextBox)c).ReadOnly=true;
		}
	}
Lo que hace es recorrer la colección de controles verificando si el tipo de cada controles TextBox ( c.GetType Is Me.txt1.GetType, c is TextBox). Si se cumple eso, se debe hacer una conversión a dicho tipo para poder acceder a las propiedades que son exclusivas de la clase TextBox (DirectCast(c, TextBox)) . Finalmente, utilizas la propiedad deseada.

En cambio si lo que se quiere es ubicar un control en específico, una opción es la siguiente:

Visual Basic

	Dim c As Control
	For Each c In Me.TabPage1.Controls
		If c Is Me.txt1 Then
			DirectCast(c, TextBox).ReadOnly = True
		End If
	Next

C#

	foreach (Control c in this.tabPage1.Controls)
	{
		if (c ==this.txt1)
		{
			((TextBox)c).ReadOnly=true;
		}
	}
La diferencia aquí es que en lugar de preguntar por el tipo del control, se pregunta si la instancia es la misma que la del control específico que se desea buscar (c Is Me.txt1, c==this.txt1) . Luego se realiza lo mismo que antes, y salimos del loop debido a que ya no se
desea seguir recorriendo la colección (ya se ha encontrado lo que se buscaba).

NOTA: no alcanzo a entender para que necesitas realizar esto último, dado que si cuentas con la referencia directa del TextBox,
no veo la necesidad de buscarlo en la colección de controles.


ir al índice