J'ai un asp: GridView qui contient un asp: TextBox dans un TemplateField. Je voudrais obtenir son identifiant pour une utilisation en javascript. Quelque chose comme ça:
<asp:TemplateField>
<ItemTemplate>
<asp:TextBox ID="textDateSent" runat="server" />
<input type="button" value='Today'
onclick="setToday('<%# textDateSent.ClientID %>');" />
</ItemTemplate>
</asp:TemplateField>
Mais quand je compile, j'obtiens une erreur:
Le nom 'textDateSent' n'existe pas dans le contexte actuel
Quelqu'un sait comment obtenir l'ID client de cette zone de texte?
Essaye ça:
<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>
Peut-être que vous ne voulez pas le faire là où vous avez besoin du ClientID. Découvrez cet article ici où les contrôles d’une ligne sont référencés de manière générique.
Vous pouvez obtenir un identifiant client comme ceci:
protected void Gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string strClientID = ((TextBox)e.Row.FindControl("txtName")).ClientID;
}
}
Cela donnera un ID client unique pour chaque zone de texte dans toutes les lignes.
Remplacez <%# textDateSent.ClientID %>
par <%= textDateSent.ClientID %>
.
Dans ce cas, vous devrez peut-être utiliser l'événement OnDataBinding de la vue de grille. Ensuite, mettez un contrôle littéral dans votre javascript. Ensuite, vous pouvez obtenir le clientID de la zone de texte et l'insérer dans votre contrôle littéral.
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
}
}
Regardez ici pour un excellent tutoriel détaillé sur le travail dans ce contexte.
Je fais juste ça ...
var tbl = document.getElementById('<%=GridView.ClientID%>');
var checkBox = tbl.rows[i].cells[11].getElementsByTagName("input")[0].id;
la cellule doit toujours être la même et il est rendu dans une entrée. Vous devrez peut-être modifier le nombre à la fin si vous avez plus d'une entrée dans cette cellule. Cela vous donnera le nouveau client/id de l'objet d'entrée (case à cocher ou autre)
C'est ce que j'ai fait. Dans la page aspx, je viens de transmettre l'objet entier à la fonction javascript, je ne me suis donc même pas adressé à l'identifiant du client. Dans mon cas, l'objet était une liste déroulante dans le EditItemTemplate du GridView. J'ai ajouté un événement html onchange (this) dans le code aspx.
<asp:DropDownList ID="custReqRegionsDDL" runat="server" onchange='custReqRegionsDDLOnChange(this)'>
</asp:DropDownList>
voici mon javascript
function custReqRegionsDDLOnChange(myDDL)
{
alert('selected text=' + myDDL.options[myDDL.selectedIndex].text);
}