Encontrar todos los controles en un panel ASP.NET?

Tengo una serie de paneles en mi página en los que estoy recostackndo información del usuario y guardando los detalles de la página. El panel de la página tiene cuadro de texto, lista desplegable, cuadro de lista.

Cuando necesito llegar a esta página. Necesito mostrar la página si estos controles tienen algún valor. ¿Como hacer esto?

Todo se reduce a enumerar todos los controles en la jerarquía de control:

IEnumerable EnumerateControlsRecursive(Control parent) { foreach (Control child in parent.Controls) { yield return child; foreach (Control descendant in EnumerateControlsRecursive(child)) yield return descendant; } } 

Puedes usarlo así:

  foreach (Control c in EnumerateControlsRecursive(Page)) { if(c is TextBox) { // do something useful } } 

Puede pasar por los controles de los paneles

 foreach (Control c in MyPanel.Controls) { if (c is Textbox) { // do something with textbox } else if (c is Checkbox) { /// do something with checkbox } } 

Si los tiene nesteds dentro, necesitará una función que lo haga recursivamente.

Sé que esta es una publicación anterior, y realmente me gustó la solución de christian libardo . Sin embargo, no me gusta el hecho de que para ceder un conjunto completo de elementos al ámbito externo tendría que iterar nuevamente sobre esos elementos solo para cederlos a mí desde un ámbito interno al scope actual. Yo prefiero:

 IEnumerable getCtls(Control par) { List ret = new List(); foreach (Control c in par.Controls) { ret.Add(c); ret.AddRange(getCtls(c)); } return (IEnumerable)ret; } 

Lo que me permite usarlo así:

 foreach (Button but in getCtls(Page).OfType 

Depende de la biblioteca de UI o el idioma que esté utilizando, los controles de contenedor como los paneles mantienen una lista de controles secundarios. Para comprobar si un formulario / página contiene datos, debe buscar de forma recursiva en cada panel controles de entrada de datos, como cuadros de texto. Luego pruebe si alguno de los controles de entrada de datos contiene valores distintos al valor predeterminado.

Una solución más simple sería implementar una clase de observador que se una a los eventos modificados de sus controles de datos. Si el observador se activa, su página tiene cambios. Deberá tener en cuenta acciones como cambiar y luego revertir datos.

Solución muy similar a la de Cristian aquí, que usa recursividad y generics para encontrar cualquier control en la página (puede especificar el control para comenzar la búsqueda).

http://intrepidnoodle.com/articles/24.aspx