Risolvere l’Errore “Could not find control ‘xxx’ in ControlParameter ‘xxx’”

11 settembre 2007 | Sviluppo Web | Nessun Commento.

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");