我有一个DataGrid,在处于编辑行状态时,我动态加载了一个验证控件,以验证一定要用户输入数据,这个验证是起作用的,但当我按下更新按钮时,这个验证控件就找不到了,我看源代码是没有相关代码了,就是说,在页面提交过后,如何才能让这个验证控件依然能够被我找到?附代码如下
private void Answer_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.EditItem)
{
TextBox m = ((TextBox)e.Item.Cells[1].Controls[0]);
m.ID = "ThisM";
m.CssClass = "input";
RequiredFieldValidator temp = new RequiredFieldValidator();
temp.ID = "Temp";
temp.Display = ValidatorDisplay.Dynamic;
temp.ErrorMessage = " 请输入答案";
temp.ControlToValidate = "ThisM";
e.Item.Cells[1].Controls.Add(temp);
}
}
这一步在点击编辑时生效,也的确是生效了,但点击更新时,新增加的temp这个验证控件就没有了,请教各位,有办法能解决吗?

解决方案 »

  1.   

    你在!IsPostBack的时候绑定datagrid,也就是postback后Answer_ItemDataBound不会执行也就不会再次添加验证控件了,这个时候当然就没有了
      

  2.   

    即使再次执行了,也不是编辑项了,也不会执行,我曾试过把temp整个存进dataview,但是也不行,这样我是不是在提交时没法验证用户是否输入了内容了?有解决方法吗?
      

  3.   

    还有一样奇怪的是,如果我用模板列,就可以在页面提交后,仍然能找到写在模板列里的验证控件,按 LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^) 的说法,同样是不执行的呀,为什么那个就能找得到呢?所以我觉得应该是有解决办法的.
      

  4.   

    不可能啊,我的就是在ItemDataBound事件中啊。。可以验证的啊
    if( e.Item.ItemType == ListItemType.EditItem )
    {
    RangeValidator rerange = new RangeValidator();
    rerange.ControlToValidate = "TextBox2";
    rerange.Type = ValidationDataType.Integer;
    rerange.Text = "*";
    rerange.Display = ValidatorDisplay.Dynamic;
    rerange.MaximumValue = "100";
    rerange.MinimumValue = "1";
    rerange.ErrorMessage = "Please input number";
    e.Item.Cells[2].Controls.Add(rerange);
    }
    我的是RangeValidator,但应该意思是一样的啊
      

  5.   

    我又试了,改成了你的RequiredFieldValidator还是可以控制的。。所以请你确认temp.ControlToValidate = "ThisM";//这个ThisM是否确实是你所要控制的
      

  6.   

    这个thisM是DataGrid处于编辑状态下的textbox,我给它取了ID名为ThisM,这样当控件解释后,变成了DataGrid ID_ctl1_ThisM,要验证的就是它,但是它是没有固定名称的
      

  7.   

    动态控制的状态问题:
    http://blog.joycode.com/saucer/archive/2004/10/20/35927.aspx
      

  8.   

    现在的问题是,我点击了更新按钮后,无法从textbox中获取到textbox的值,用 ((TextBox)Answer.Items[e.Item.ItemIndex].Cells[1].Controls[0]).Text 取出的会是空,而再次输入内容点击后,就能取到值,但是又无法验证了
      

  9.   

    to foxconn_nich(边解俺的分就这么少?) 
    现在的问题变成了,只要做成模板列,模板列里的文本框是能够保值的,但是用 ((TextBox)Answer.Items[e.Item.ItemIndex].Cells[1].Controls[0]).Text 方法,可以发现textbox不能保值了,这就是问题关键,只要能取到这个值,一切问题都解决了.
      

  10.   

    to foxconn_nich(边解俺的分就这么少?) 
    我又试验了一下,终于发现问题所在了
    if (e.Item.ItemType == ListItemType.EditItem)
    {
    TextBox m = ((TextBox)e.Item.Cells[1].Controls[0]);
    m.ID = "ThisM";
    m.CssClass = "input";
    temp = new RequiredFieldValidator();
    temp.ID = "Temp";
    temp.Display = ValidatorDisplay.Dynamic;
    temp.ErrorMessage = " 请输入答案";
    temp.ControlToValidate = m.ID;
    e.Item.Cells[1].Controls.Add(temp);
    ((LinkButton)e.Item.Cells[3].Controls[0]).Attributes.Add("onclick","BrushOffAll();ValidatorEnable(" + temp.ClientID + ",true);");
    }
    原来问题出在 m.ID = "ThisM"; 这一行上!
    在给m的ID赋过值后,再点击更新,m就不能保值了,只要把这句话注掉,m就能实现保值,但是新的问题又来了,如果把这句话注掉,temp的 ControlToValidate 属性就无法设置了,也就无法添加验证控件了,各位,对这个问题有解吗?
      

  11.   

    你那个TextBox是动态增加的吗?如果是,请
    e.Item.Cells[1].Controls.Add//增加这个控件如果不是
    你在ItemDataBound事件中只要动态产生那个equiredFieldValidator就可以了,而在UpdateCommand事件中去TextBox BigMenuName = (TextBox)e.Item.FindControl("控件ID");
      

  12.   

    这个textbox不是动态增加的,它是datagrid在处于编辑状态下时,自动产生的,我的列类型是BoundColumn,它在编辑状态下是会变成textbox的,我本来就在ItemDataBound事件中动态产生RequiredFieldValidator以验证它不能为空,但是不能使用TextBox)e.Item.FindControl("控件ID"),原因是没有为textbox赋过id,如果赋过,自然可以得到,但当页面提交后,会得不到原来填入的值,换句话说就是不能保值,否则保值是可以的,但是不能得到textbox的ID,我看过源文件,它是没有ID的,也就无法为RequiredFieldValidator控件指定ControlToValidate的值,验证控件就无效了
      

  13.   

    你也不要把问题搞得太偏激,能实现就OK了。。用模版列吧。再加上ItemDataBound事件中动态加载RequiredFieldValidator去控制<EditItemTemplate>中的TextBox,其它的,我无能为力了<asp:TemplateColumn>
    <HeaderStyle Width="35%"></HeaderStyle>
    <ItemTemplate>
    <%# DataBinder.Eval(Container,"DataItem.SmallTemplet_Link")%>
    </ItemTemplate>
    <EditItemTemplate>
    <asp:TextBox ID="TextBox3" Runat="server" Text='<%# DataBinder.Eval(Container,"DataItem.SmallTemplet_Link")%>' Width="90%" Height="20px">
    </asp:TextBox>
    </EditItemTemplate>
      

  14.   

    唉,我就是不想用模板列啊,那个早就会了,没什么创意的不过我也已经研究出来了,是可以做到了,只需要在pageload事件里多加一步判断就可以了,net处理回发机制是以ID号来做为标识的,只要相同的ID号在pageload事件里生成,就能实现保值了.