如何在GridView中获取服务器控件ID?

时间:2011-05-28 16:58:36

标签: asp.net data-binding gridview

我正在尝试访问位于GridView内部的服务器控件,但我不知道如何做到这一点.. 这是我的尝试:

<asp:GridView ....
.....
  <Columns>
    <asp:TemplateField>
      ...
      ..
      <EditItemTemplate>
        <asp:TextBox ID="txtName"runat="server" Text='<%# Bind("Name") %>' />
      </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="edit" ItemStyle-CssClass="td" 
                       HeaderStyle-CssClass="listtitle">
      <ItemTemplate>
        <asp:ImageButton ID="btnEdit" runat="server" CommandName="Edit" 
                         AlternateText="edit" ImageUrl="~/css/images/edit-icon.png" />
      </ItemTemplate>
      <EditItemTemplate>
        <asp:LinkButton ID="btnUpdate" runat="server" CommandName="Update" Text="Save" 
                        OnClientClick="javascript:return isValid('<%= txtName.ClientID%>')" /> | 
        <asp:LinkButton ID="btnCancel" runat="server" 
                        CommandName="Cancel" Text="Cancel" />
      </EditItemTemplate>
    </asp:TemplateField>
    ...
    ..
  </Columns>
  .....
  ....
</asp:GridView>

问题出在这里

OnClientClick="javascript:return isValid('<%= txtName.ClientID%>')"

当它到达isValid函数时,我看到字符串“&lt;%= txtName.ClientID%&gt;”而不是我应该的实际控制器ID ..

所以问题是如何将id发送到JS脚本?

3 个答案:

答案 0 :(得分:0)

在RowDataBound事件上,您需要读取txtName的客户端ID并设置链接按钮的OnClientClick。

void myGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        TextBox txt = (TextBox)e.Row.FindControl("txtName");
        Button btn = (LinkButton)e.Row.FindControl("btnUpdate");
        btn.OnClientClick = String.Format("javascript:return isValid('{0}')", btn.ClientID);
    }
}

答案 1 :(得分:0)

如果字段在ItemTemplate上,那么ibrams的回答是正确的。但是当您在EditItemTemplate时,这不起作用也必须检查RowState。条件将是这样的

if ((e.Row.RowState == (DataControlRowState.Edit | DataControlRowState.Alternate)) || (e.Row.RowState == DataControlRowState.Edit)) 
{
    //logic here
}

但更短的解决方案是检查此条件GridView1.EditIndex == e.Row.RowIndex

该片段应为此。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow && GridView1.EditIndex == e.Row.RowIndex)
    {
        TextBox txt = (TextBox)e.Row.FindControl("txtName");
        LinkButton btn = (LinkButton)e.Row.FindControl("btnUpdate");
        string script = String.Format("javascript:return isValid('{0}')", btn.ClientID);
        btn.Attributes.Add("onclick", script);
    }
}

答案 2 :(得分:0)

由于您要验证txtName textBox的值,因此使用标准的asp.net验证控件会更好。如果您有一些补语验证规则,那么您可以使用CustomValidator并指定javascript函数以在客户端处理验证。只需为附加到txtName控件和btnUpdate按钮的验证器设置相同的validatio ngroup值。