【问题标题】:How to get server-control id that in GridView?如何在 GridView 中获取服务器控件 ID?
【发布时间】:2011-05-28 16:58:35
【问题描述】:

我正在尝试访问位于 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 函数时,我看到了字符串“”,而不是我应该看到的实际控制器 ID..

那么问题是如何将 id 发送到 JS 脚本?

【问题讨论】:

    标签: asp.net data-binding gridview


    【解决方案1】:

    如果字段位于ItemTemplate 上,则 ibrams 的答案将是正确的。但是,当您在EditItemTemplate 上时,这将不起作用,还必须检查RowState。条件会是这样的

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

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

    sn-p 应该是这个。

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

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

      【讨论】:

      • ibram,不错的解决方案。但你错过了 edititemtemplate 部分
      【解决方案3】:

      当您想要验证 txtName 文本框的值时,最好使用标准的 asp.net 验证控件。如果您有一些复杂的验证规则,那么您可以使用 CustomValidator 并指定 javascript 函数来处理客户端的验证。只需为附加到 txtName 控件的验证器和 btnUpdate 按钮设置相同的验证组值。

      【讨论】:

        猜你喜欢
        • 2019-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-21
        • 2012-06-23
        • 1970-01-01
        相关资源
        最近更新 更多