2008-11-10 29 views
8

Tengo una serie de paneles en mi página en los que recojo información del usuario y guardo los detalles de la página. El panel de la página tiene cuadro de texto, lista desplegable, cuadro de lista.¿Encontrar todos los controles en un panel de ASP.NET?

Cuando tengo que entrar en esta página. Necesito mostrar la página si estos controles tienen algún valor. ¿Como hacer esto?

Respuesta

27

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

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

Usted puede utilizar de esta manera:

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

respuesta bellamente escrita. Claro, conciso, directo, y me habría llevado mucho más tiempo llegar por mi cuenta al código correcto. ¡Gracias, Cristian! – randomfactor

+0

Genio! Gracias. –

+0

¡Brillante! Muchas gracias. –

5

Puede recorrer a través de los paneles controla

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 anidados dentro, necesitará una función que lo haga recursivamente.

+0

¡Funcionó como un amuleto! Gracias GeekyMonkey, y gracias, como siempre Stack Overflow! – aape

0

Según 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 los controles de datos. Si el observador se activa, su página tiene cambios. Deberá tener en cuenta acciones como cambiar y luego revertir datos.

0

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

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

1

Sé que esto es una entrada antigua, y realmente me gustó solución christian libardo's. 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 alcance actual. Prefiero:

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

que me permite usarlo de esta manera:

foreach (Button but in getCtls(Page).OfType<Button>()) 
{ 
    //disable the button 
    but.Enabled = false; 
} 
+0

Creo que Christian sería mejor ya que su enfoque parece evaluar perezosamente, y el mío no lo haría. – theoski

Cuestiones relacionadas