Il controllo FormView e le sue piccole “trappole”

Era da tempo che non riprendevo un progetto ASP.Net in mano e visto che mi ero fermato ad ASP.Net 1.1, quale buona occasione per dare una rispolverata e vedere alcuni dei nuovi controlli del 2.0.

Tra questi il FormView, interessante. Come al solito in casa Microsoft hanno fatto tanto lavoro, ma puntualmente le cose più ovvie non le mettono mai a portata di mano.

Abituato al vecchio approccio, quando avevo bisogno di accedere ad un controllo nella pagina dal code behind, dichiaravo molto semplicemente una variabile protected internal di tipo HtmlGenericControl se si trattava di un controllo HTML standard “taggato” con l’attributo runat=”server” o di tipo indentico a quello impostato nell’IDE e semnplicemente accedevo al controllo utilizzando la variabile locale.

Con il FormView questo sistema non funziona. Il FormView crea una sorta di scatola chiusa inaccessibile dall’esterno. Almeno a prima vista sembra così.

Anche usando il metodo FindControl non ero in grado di accedere ai controlli dichiarati all’interno del FormView.

Dopo alcune ricerche ho finalmente capito che nel metodo OnLoad della pagina, il FormView non è stato ancora del tutto inizializzato; i controlli al suo interno ancora non esistono nello scope della pagina. Per potervi accedere è quindi necessario attendere che i controlli esistano ed in particolare utilizzare l’evento ItemCreated.

Esempio:

protected void FormView1_ItemCreated(object sender, EventArgs e)

{

    Panel myPanel = (Panel)FormView1.FindControl(“myPanel”);

    if (true)

        myPanel .Visible = false;

     else

        ……

}

Altra cosa che mi ha fatto perdere un pò di tempo è stata quella di cercare di accedere ai dati associati al dataSource associato al FormView. Anche qui dopo alcune ricerche la soluzione è traducibile così:

Esempio:

protected void FormView1_DataBound(object sender, EventArgs e)

{

    DataRowView r = (DataRowView)FormView1.DataItem;

    ….

}

In questo modo si cattura il contenuto del DataSource all’interno di un DatarowView, la cui propietà Row, tramite indice, consentirà di accedere al singolo dato ritornato.