Con ASP.NET 2.0 la gerarchia della pagina è molto più frequentemente multilivello di quanto non succedesse con la versione predecende, soprattutto quando si utilizzano le masterpages. Di conseguenza, quando si vuole ottenere un riferimento ad un controllo della pagina dato il suo ID, non è sufficiente utilizzare il metodo FindControl() dell'oggetto Page perchè esso effettua una ricerca solo tra i diretti discendenti della pagina, e non effettua una ricerca ricorsiva all'interno di controlli che a loro volta ne contengono altri.
Per ottenere un riferimento ad un controllo posizionato in un livello arbitrario all'interno della pagina si può utilizzare questo metodo, che effettua una ricerca ricorsiva in tutti i controlli della pagina.
Non ho avuto modo di verificare questa affermazione, ma in pagine con tanti controlli innestati, ad esempio quando abbiamo DataGrid o DataList, può essere che un metodo di questo tipo introduca un certo overhead.
public static Control FindControl(string controlID, ControlCollection controls)
{
foreach (Control control in controls)
{
if(control.ID == controlID)
return control;
if(control.HasControls())
{
Control nestedControl = FindControl(controlID, control.Controls);
if(nestedControl != null)
return nestedControl;
}
}
return null;
}
I parametri che accetta sono naturalmente una stringa contenente l'ID del controllo da trovare ed una ControlCollection all'interno della quale cercare. Per cercare all'interno della ControlCollection principale, ossia quella della pagina, la chiamata al metodo dovrà essere di questo tipo:
Control foundControl = FindControl(foundControlID, Page.Controls);
powered by IMHO 1.3