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:
Publicar un comentario