lunes, 20 de diciembre de 2010

Acceder a los controles de la página que está dentro de una MasterPage

Uno de esos inesperados dolores de cabeza que, casi en producción, me han surgido en el proyecto que ya finaliza. Tengo una página dentro de una MasterPage y quiero que las cajas de texto, y demás controles, se inhabiliten. Y no quiero ir una a una.

Sorprendentemente si utilizo un simple foreach(Control control in Page.Controls) esto no funciona. Por lo cual me he devanado un poquillo los sesos buscando como preguntar en San Google y he acabado en el foro de msdn con la siguiente respuesta

private void ClearForm(ControlCollection ctrlsCollection) // I don't get why I have to pass a ControlCollection here !  
{

if (ctrlsCollection == null) // i.e. if the collection is empty
{
return; // do nothing
}

foreach (Control c in ctrlsCollection)
{
if (c.HasControls()) // boolean True or False if it has child controls.
{
ClearForm(c.Controls); // Go back and run the method again .. kind of like depth traversal .. keeps going inside till there are no more child controls.
}
else // If there are no child controls.
{
if (c.GetType() == new TextBox().GetType()) // Check if the type of control matchs that of a text box (i.e. is that control a text box control)
{
((TextBox)c).Text = "HELLO"; // If YES .. then type cast the C as a text box control and clear its text.
}
}
}
}

O sea, utilizo recursividad para ir ahondando en los diferentes arboles de controles que lleva la página que tengo en pantalla y lo comparo con el tipo de control que quiero. En este caso, y para ver claramente que funciona en vez de decirle un .Enable = false le digo que me escriba en todos los TextBox que encuentra la palabra HELLO.



Para invocarla, por ejemplo

protected void Page_Load(object sender, EventArgs e)
{
ClearForm(Page.Controls);
}



Espero que os sea tan útil como a mi.

No hay comentarios: