Risolvere l’Errore “Could not find control ‘xxx’ in ControlParameter ‘xxx’”
Prendiamo, per esempio, questo codice:
<asp:DetailsView ID="DetailsView1" runat="server"
AutoGenerateRows="false" DataSourceID="SqlDataSource1">
<Fields>
<asp:BoundField DataField="ID" />
<asp:TemplateField>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"
Text='<%# (string)Eval("Nome") %>' />
</EditItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
SelectCommand="SELECT ID, Nome FROM TabellaDiProva WHERE ID = @ID"
UpdateCommand="UPDATE TabellaDiProva SET Nome = @Nome WHERE ID = @ID">
<SelectParameters>
<asp:QueryStringParameter Name="ID"
QueryStringField="id" />
</SelectParameters>
<UpdateParameters>
<asp:QueryStringParameter Name="ID"
QueryStringField="id" />
<asp:ControlParameter Name="Nome"
ControlID="TextBox1" />
</UpdateParameters>
</asp:SqlDataSource>
Niente di eccezionale, un controllo DetailsView con un SqlDataSource associato. Questo codice però vi restituirà il seguente errore: "Could not find control ‘TextBox1′ in ControlParameter ‘Nome’.".
In pratica ASP.NET, quando deve calcolare i valori da assegnare ai parametri della query di aggiornamento, non riesce a trovare il controllo TextBox1: questo perchè è nidificato all’interno del DetailsView. Esiste un modo molto semplice e indolore per ovviare a questo problema, che non richiede neanche una linea di codice aggiuntiva:
<asp:ControlParameter Name="Nome" ControlID="DetailsView1$TextBox1" />
Come potete vedere ho modificato il valore dell’attributo ControlID assegnandogli il percorso della TextBox, attraverso l’utilizzo del simbolo $ (dollaro) che separa i nomi dei controlli.
Con questo piccolo stratagemma il noiosissimo errore scomparirà!
Aggiornamento: questo sistema funziona anche con il metodo FindControl, permettendo di avere una sintassi più concisa:
TextBox t = (TextBox)Page.FindControl("DetailsView1$TextBox1");