Come posso recuperare il contenuto di un controllo utilizzato all’interno di una GridView?

Utente HTML.it
chiede

Come posso recuperare il contenuto di un controllo utilizzato all’interno di una GridView?

Redazione HTML.it
risponde

Si deve richiamare il metodo FindControl sull’oggetto GridViewRow che rappresenta la riga corrente della GridView. Supponiamo di avere una GridView definita come segue:

<asp:GridView ID="GridView1" runat="server" AutoGenerateSelectButton="True" AutoGenerateColumns="false"
            OnSelectedIndexChanging="GridView1_SelectedIndexChanging">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Label ID="lblNome" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

protected void Page_Load(object sender, EventArgs e)
{
    List<Person> list = new List<Person>();
    Person p = new Person(); p.Name = "Marco";
    Person p2 = new Person(); p2.Name = "Andrea";
    list.Add(p);
    list.Add(p2);

    GridView1.DataSource = list;
    GridView1.DataBind();
}

Nella routine GridView1_SelectedIndexChanging scriviamo il codice per recuperare il riferimento al controllo Label associato alla riga corrente:

protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
    Label lbl = (Label)GridView1.Rows[e.NewSelectedIndex].FindControl("lblNome");
    Response.Write("Hai selezionato il nome " + lbl.Text);
}

Con l’istruzione GridView1.Rows[e.NewSelectedIndex] otteniamo il GridViewRow di posizione e.NewSelectedIndex, quindi su di esso richiamiamo il metodo FindControl, passandogli come argomento il nome dell’oggetto (così come è stato definito nel template della GridView).