none
动态添加验证控件问题 RRS feed

  • 问题

  • 我想实现动态添加验证控件,但是碰到了一个问题

    前台代码如下GridView

     <asp:TemplateField HeaderText="角色编码">
              <ItemTemplate>
                <asp:Label Text='<%# Eval("roleCode") %>' ID="lblRoleCode" runat="server">          
                </asp:Label>
              </ItemTemplate>
              <EditItemTemplate>
                <asp:TextBox runat="server" ID="txtRoleCode" Text='<%# Eval("roleCode") %>'></asp:TextBox>
              </EditItemTemplate>
            </asp:TemplateField>
    
    

    后台代码如下:

     

    private void setValiting()
      {
           RequiredFieldValidator require = new RequiredFieldValidator();
          require.ControlToValidate =“txtRoleCode”;
          require.EnableClientScript = true;
          require.Display = ValidatorDisplay.Dynamic;
          require.ErrorMessage = "角色不能为空";
          panelVali.Controls.Add(require);
    
        
      }
    

    在进行编辑进行 对gridview进行绑定后调用后台方法

    提示找不到txtRoleCode

     

    请问有什么办法可以解决

    另外关于动态添加验证控件有没有其它的好的办法

    谢谢

    2010年9月17日 7:15

答案

全部回复

  • 你在gridview 的textbox在中经过编译后,客户端id已经发生来变化,你可以右键 --“查看源文件”,看看textbox客户端生成的ID是什么,

    例如如果你在gridview中的textbox 的为   

    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

    在客户端经过编译后可能显示为

    <INPUT id=GridView1_ctl30_TextBox1 name=GridView1$ctl30$TextBox1>


    http://blog.csdn.net/zx13525079024
    2010年9月17日 8:56
  • 哦 原来是这个问题

    我把前台代码改成这样可以正常运行

    <asp:TemplateField HeaderText="角色编码">
      <ItemTemplate>
      <asp:Label Text='<%# Eval("roleCode") %>' ID="lblRoleCode" runat="server">  
      </asp:Label>
      </ItemTemplate>
      <EditItemTemplate>
     <asp:Panel runat="server" ID="panelVali">
      <asp:TextBox runat="server" ID="txtRoleCode" Text='<%# Eval("roleCode") %>'></asp:TextBox>
      </asp:Panel>
      </EditItemTemplate>
      </asp:TemplateField>
    .....
      </Columns>
      </asp:GridView>

     

     

    但是这样就不通用了

    2010年9月17日 9:14
  • 对成这样了

    <input name="ctl00$ContentPlace$dvRole$ctl02$txtRoleCode" type="text" value="0001" id="ctl00_ContentPlace_dvRole_ctl02_txtRoleCode" />

    请问有没有什么办法可以解决呀

    谢谢

    2010年9月17日 9:18
  • 你想怎样通用,你看看TEXTBOX在客户端前后生成的ID有什么差别。


    http://blog.csdn.net/zx13525079024
    2010年9月17日 9:32
  • 我想把GridView 和验证的控件分离开来

    我在后台设置要验证的规则后会自动生成验证控件 然后和GridView关联起来

    现在我在关联的地方出了问题 就是那个找不到ID的问题

    2010年9月17日 9:38
  • 对于模板中的控件,是无法直接靠ID访问到的,因为会有多个相同ID的控件在不同的行。

    建议用rowitem.FindControl(id)方法找,找出来再强转成控件类型。

    假如说你用的是GridView,EditTemplate中有txtRoleCode控件,你想在RowUpdating方法中找到那个控件,那就用如下代码

    (TextBox)grid.Row[e.RowIndex].FindControl("txtRoleCode")

    来找到你的控件。

    注意,如果你当前行处于Edit状态,rowitem.FindControl是找不到ItemTemplate中的控件的,

    同理,如果当前行处于Normal状态,rowitem.FindControl是找不到EditTemplate中的控件的.


    Love Your Neighbor as Yourself
    2010年9月17日 11:55
  • 现在的总是是 可以通过FindControl找到 但是我为验证控件指定TEXTBOX的ID后 提示找到不到EditTemplate中的那个控件

    2010年9月18日 2:23
  • 你好:

    你是在什么事件中查询该控件?如果是在提交后应该可以找到。

    你也可以先索引到单元格中,再查找。(TextBox)grid.Row[e.RowIndex].FindControl("txtRoleCode");

    请参照如下文章

    http://www.cnblogs.com/30ErLi/archive/2010/09/17/1828860.html
    http://www.cnblogs.com/chjun2000/archive/2009/11/01/1594064.html
    http://www.cnblogs.com/jian1982/archive/2010/06/17/1759634.html
    http://www.cnblogs.com/puke/archive/2007/06/02/768595.html

    希望对你有所帮助。

    2010年9月21日 5:32
    版主
  • 在点击edit按钮的时候,查找所点击的哪行的控件的真实id,然后再动态添加

    或者在pageload的时候动态添加,在edit的时候去改他的验证控件id

     

    另外,其实我觉得,可以给每一个后面都静态的加这个验证控件,在最下面,你希望的地方加summury,每行的控件你可以设置成不显示

    2010年9月21日 14:19