如何在ASP.NET GridView中查找控件的客户端ID?

19

我有一个包含在TemplateField中的asp:TextBox的asp:GridView,我想获取它的ID以便在JavaScript中使用。类似这样:

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

但是当我编译时,出现以下错误:

名称“textDateSent”在当前上下文中不存在

有人知道如何获取此TextBox的客户端ID吗?

6个回答

32

试一试这个:

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

嗨,Chris,根据您的建议,我在我的代码中做了以下更改,但无法按预期返回值:curTexbox.Attributes.Add("onBlur", "return multiplication('" + curTexbox.ClientID + "','" + curTexbox1.ClientID + "','<%# ((GridViewRow)Container).FindControl(txtAmount).ClientID %>')"); 如果我有错误,请您指正。 - Developer
用户,很好的用户名,但是你是否忘记在txtAmount周围加上引号了?也许它是一个变量名。这段代码有点令人困惑,因为我看到数据绑定语法与Attributes.Add结合使用,这使得它看起来像是从行数据绑定事件中调用的东西。如果你在数据绑定事件中,那么要获取FindControl的行容器,可以使用传递到该方法中的GridViewRowEventArgs参数e.Row.FindControl。 - Chris Mullins
解析器错误消息:服务器标记格式不正确。 啊,你们是怎么让它工作的?!我在用VS2005 asp.net2。 - Fandango68
不确定问题出在哪里,但我会从检查所有引号是否匹配以及开始和结束标签是否正确入手。 - Chris Mullins

2
也许你不想在需要ClientID的地方进行操作。查看这篇文章,在其中以通用方式引用行中的控件:此处

1

<%# textDateSent.ClientID %>更改为<%= textDateSent.ClientID %>

哎呀,您可能需要使用GridView的OnDataBinding事件。然后在您的JavaScript中放置一个文字控件。然后,您可以获取文本框的客户端ID并将其输入到文字控件中。

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
        }
    }

在这个环境中工作,可以查看一个非常详细的教程


男孩...直接与问题发布者沟通不是更容易吗! :P 请检查我的更新。 - Andrew Siemer
1
因为它可行所以被点赞,但我更喜欢Chris的回答,因为它不是在代码后台完成的。 - Keltex

1
您可以像这样获取客户端ID:

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

这将为所有行中的每个文本框提供唯一的客户端ID。

0
这是我所做的。在 aspx 页面中,我只是将整个对象传递给 JavaScript 函数,因此我甚至不需要客户端 ID。在我的情况下,该对象是 GridView 的 EditItemTemplate 中的下拉列表。我在 aspx 代码中添加了一个 html onchange(this) 事件。

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

这是我的 JavaScript:
function custReqRegionsDDLOnChange(myDDL)
    {
        alert('selected text=' + myDDL.options[myDDL.selectedIndex].text);

}


0

我只是这样做...

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

该单元格应始终保持不变,并呈现为输入框。如果该单元格中有多个输入框,则可能需要更改末尾的数字。这将为您提供输入对象(复选框或其他)的新客户端ID / ID。


1
清晰简洁。 - user5713018

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接