web-dev-qa-db-fra.com

Comment trouver l'ID client du contrôle dans un GridView ASP.NET?

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?

16
Keltex

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>
30
Chris Mullins

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.

2
JBrooks

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.

1

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.

1
Andrew Siemer

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

}

0
Roto