2009-07-15 19 views
16

Ho un asp: GridView che contiene un asp: TextBox all'interno di un TemplateField. Vorrei ottenere il suo ID per l'uso in javascript. Qualcosa di simile a questo:Come trovare l'ID client di controllo all'interno di un GridView di ASP.NET?

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:TextBox ID="textDateSent" runat="server" /> 
     <input type="button" value='Today' 
      onclick="setToday('<%# textDateSent.ClientID %>');" /> 
    </ItemTemplate> 
</asp:TemplateField> 

Ma quando compilo, ottengo un errore:

The name 'textDateSent' does not exist in the current context

Qualcuno sa come ottenere l'ID client di questa TextBox?

risposta

30

Prova questo:

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:TextBox ID="textDateSent" runat="server"> 
     </asp:TextBox>      
     <input type="button" value='Today' onclick="setToday('<%# ((GridViewRow)Container).FindControl("textDateSent").ClientID %>');" /> 
    </ItemTemplate> 
</asp:TemplateField> 
+0

+1 Molto bello! Breve e dolce. –

+0

+1 Soluzione superba. Sicuramente risparmia molto codice. – suryakiran

+0

Ciao 'Chris' come per il tuo ho fatto quanto segue nel mio codice ma non riesco a restituire il valore come necessario' curTexbox.Attributes.Add ("onBlur", "return moltiplicazione ('" + curTexbox.ClientID + "' '' + curTexbox1.ClientID + "',' <% # ((GridViewRow) Container. .FindControl (txtAmount).ClientID%> ') ");' puoi correggere se ho torto – Dotnet

1

Modifica <%# textDateSent.ClientID %> a <%= textDateSent.ClientID %>.

Argh, potrebbe essere necessario utilizzare l'evento OnDataBinding della visualizzazione griglia. Quindi metti un controllo letterale nel tuo javascript. Quindi puoi ottenere il clientID della casella di testo e inserirlo nel tuo controllo letterale.

protected void GridViewName_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      //Create an instance of the datarow 
      DataRowView rowData = (DataRowView)e.Row.DataItem; 

      //locate your text box 
      //locate your literal control 
      //insert the clientID of the textbox into the literal control 
     } 
    } 

Guardate qui per una great detailed tutorial a lavorare in questo contesto.

+0

che non funziona neanche. – Keltex

+0

Boy ... non dirigerebbe la comunicazione con la domanda poster, sarebbe molto più facile! : P Controlla il mio aggiornamento. –

+1

su votato perché funziona, ma preferisco la risposta di Chris perché non è fatta in code-behind. – Keltex

2

Forse non si vuole farlo in cui è necessario il ClientID. Dai un'occhiata a questo post here dove i controlli di una riga sono referenziati in modo generico.

1

È possibile ottenere ID client in questo modo:

protected void Gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     string strClientID = ((TextBox)e.Row.FindControl("txtName")).ClientID; 
    } 
} 

Questo darà ID cliente univoco per ciascuna casella di testo in tutte le righe.

1

Io faccio solo questo ...

var tbl = document.getElementById('<%=GridView.ClientID%>'); 
var checkBox = tbl.rows[i].cells[11].getElementsByTagName("input")[0].id; 

la cella deve essere sempre lo stesso e diventa reso in un ingresso. Potrebbe essere necessario modificare il numero alla fine se si dispone di più di un input in quella cella. Questo ti darà il nuovo clientid/id dell'oggetto di input (casella di controllo o qualsiasi altra cosa)

+0

Chiaro e semplice. –

0

Questo è quello che ho fatto. Nella pagina di aspx ho appena passato l'intero oggetto alla funzione javascript, quindi non ho nemmeno avuto l'idea di id client. Nel mio caso l'oggetto era un elenco a discesa in EditItemTemplate di GridView. Ho aggiunto un evento html onchange (this) nel codice aspx.

<asp:DropDownList ID="custReqRegionsDDL" runat="server" onchange='custReqRegionsDDLOnChange(this)'> </asp:DropDownList>

qui è il mio javascript

function custReqRegionsDDLOnChange(myDDL) 
    { 
     alert('selected text=' + myDDL.options[myDDL.selectedIndex].text); 

}