http://community.csdn.net/Expert/topic/5432/5432250.xml?temp=.512768
http://community.csdn.net/Expert/topic/5432/5432306.xml?temp=.6382715
在控件中this.Parent.Controls.Add(req);
这里出错提示:
在 DataBind、Init、Load、PreRender 或 Unload 阶段,不能修改该控件集合。我想这里是因为这里是控件而网页还没有加载完吧(我的理解)
如果用this.Controls.Add(req);
HTML就为:
<span id="WebRev1" style="color:Red;visibility:hidden;"><span id="ctl02" style="color:Red;visibility:hidden;">没有输入</span></span>
而正确的应该为
<span id="WebRev1" style="color:Red;visibility:hidden;"></span><span id="ctl02" style="color:Red;visibility:hidden;">没有输入</span>
这样才对

解决方案 »

  1.   

    这是我的代码: protected void Page_Load(object sender, EventArgs e)
        {        MyRegValidtor reg = new MyRegValidtor();
            reg.NotNullMessage = "不可空";
            reg.ControlToValidate = "TextBox1";
            reg.ValidationExpression = @"\d*";
            reg.ErrorMessage = "只许输入数字!";
            this.form1.Controls.Add(reg);
            
        }
      

  2.   

    <form id="form1" runat="server" enableviewstate="false">
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            
            <asp:Button ID="Button1" runat="server" Text="Button" />  
      
      
      </form>
      

  3.   

    类的:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;/// <summary>
    /// MyRegValidtor 的摘要说明
    /// </summary>
    public class MyRegValidtor:System.Web.UI.WebControls.RegularExpressionValidator 
    {
    public MyRegValidtor()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }    protected override void OnInit(EventArgs e)
        {
            RequiredFieldValidator req = new RequiredFieldValidator();
            req.ControlToValidate = this.ControlToValidate;
            req.ErrorMessage = this.NotNullMessage;
            this.Parent.Controls.Add(req);   
            base.OnInit(e);
        }    public string NotNullMessage
        {
            get
            {
                return ViewState["NotNullMessage"] != null ? (string)ViewState["NotNullMessage"] : "";
            }        set {
                ViewState["NotNullMessage"] = value;
            }
        }
       
        }
      

  4.   

    类的是没有问题
    但是我写到成控件的时候
    this.Parent.Controls.Add(req); 这一句就不行了
    以下是我的理解:
    因为现在是在控件里面Parent是为空的或者页面添有加载完成的时候不存在
    这里出错提示:
    在 DataBind、Init、Load、PreRender 或 Unload 阶段,不能修改该控件集合。我想这里是因为这里是控件而网页还没有加载完吧(我的理解)
    如果用this.Controls.Add(req);
    HTML就为:
    <span id="WebRev1" style="color:Red;visibility:hidden;"><span id="ctl02" style="color:Red;visibility:hidden;">没有输入</span></span>
    而正确的应该为
    <span id="WebRev1" style="color:Red;visibility:hidden;"></span><span id="ctl02" style="color:Red;visibility:hidden;">没有输入</span>
    这样才对
      

  5.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;namespace ZYCControl
    {
        public class webRev : System.Web.UI.WebControls.RegularExpressionValidator
        {
            protected System.Web.UI.HtmlControls.HtmlForm form1;
            public string NotNullMessage
            {
                get
                {
                    return ViewState["NotNullMessage"] != null ? (string)ViewState["NotNullMessage"] : "";
                }            set
                {
                    ViewState["NotNullMessage"] = value;
                }
            }        protected override void OnInit(EventArgs e)
            {
                RequiredFieldValidator req = new RequiredFieldValidator();
                req.ControlToValidate = this.ControlToValidate;
                req.ErrorMessage = this.NotNullMessage;
                form1 = new HtmlForm();
                form1.Controls.Add(req);
                base.OnInit(e);
            }
        }
    }
      

  6.   

    RequiredFieldValidator req = new RequiredFieldValidator();
    req.ControlToValidate = this.ControlToValidate;
    req.ErrorMessage = this.NotNullMessage;
    this.Parent.Controls.Add(req);
    base.OnInit(e);提示:在 DataBind、Init、Load、PreRender 或 Unload 阶段,不能修改该控件集合。
      

  7.   

    <cc1:webRev ID="WebRev1" runat="server" Display="Dynamic" ControlToValidate="TextBox1" ErrorMessage="*" NotNullMessage="**" ValidationExpression="\d"></cc1:webRev>
            <asp:Button ID="Button1" runat="server" Text="Button" />
    这是aspx
      

  8.   

    这样呢?  
    protected override void OnLoad(EventArgs e)
            {
                RequiredFieldValidator req = new RequiredFieldValidator();
                req.ControlToValidate = this.ControlToValidate;
                req.ErrorMessage = this.NotNullMessage;
                form1 = new HtmlForm();
                form1.Controls.Add(req);
                base.OnInit(e);
            }
      

  9.   

    flyin2006(【败家子】古有平民成霸业,何愁白手一书生)
    你那样不会报错,但却什么功能也没有加
    HTML显示
    <span id="WebRev1" style="color:Red;display:none;">*</span>
    而应该为
    <span id="WebRev1" style="color:Red;display:none;">*</span>
    <span id="ctl001" style="color:Red;display:none;">*</span>
      

  10.   

    protected override void OnInit(EventArgs e)
            {
                RequiredFieldValidator req = new RequiredFieldValidator();
                req.ControlToValidate = this.ControlToValidate;
                req.ErrorMessage = this.NotNullMessage;
                Literal l = new Literal();
                l.Text = this.ErrorMessage;
                this.Controls.Add(l);
                this.Controls.Add(req);
                base.OnPreRender(e);            base.OnInit(e);
            }
      

  11.   

    protected override void OnLoad(EventArgs e)
            {
                RequiredFieldValidator req = new RequiredFieldValidator();
                req.ControlToValidate = this.ControlToValidate;
                req.ErrorMessage = this.NotNullMessage;
                form1 = new HtmlForm();
                form1.Controls.Add(req);
                base.OnLoad(e);
            }
      

  12.   

    幕白的不行<span id="WebRev1" style="color:Red;display:none;">*<span id="ctl03" style="color:Red;visibility:hidden;">**</span></span>
    生成应该为
    <span id="WebRev1" style="color:Red;display:none;">*</span><span id="ctl03" style="color:Red;visibility:hidden;">**</span>
      

  13.   

    <span id="WebRev1" style="color:Red;display:none;">*<span id="ctl03" style="color:Red;visibility:hidden;">**</span></span>
    ==========
    如果不大改控件的话,就只能生成这样.但是这样是可以的,我试过了.
      

  14.   

    我知道这样可以做到判断,但当控件为空的时候不会显示出来
    因为
    <span id="ctl03" style="color:Red;visibility:hidden;">**</span>
    在webRev1里面
    而用CS写的就是
    <span id="WebRev1" style="color:Red;display:none;">*</span><span id="ctl03" style="color:Red;visibility:hidden;">**</span>
    就可以显示了
      

  15.   

    这是我的:
       <form id="form1" runat="server" enableviewstate="false">
            <cc1:myregvalidtor id="MyRegValidtor1" runat="server" ControlToValidate="TextBox1" ErrorMessage="数字" NotNullMessage="不可空" ValidationExpression="\d*"></cc1:myregvalidtor>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Button" />
        
      
      
      </form>
      

  16.   

    生成的html
     <span id="MyRegValidtor1" style="color:Red;visibility:hidden;">数字<span id="ctl03" style="color:Red;visibility:hidden;">不可空</span></span>可以达到验证不为空或只许输入数字的功能.
      

  17.   

    但是他们两个的错误提示都没有出来啊
    ErrorMessage="数字" NotNullMessage="不可空" 
    可不"数字他不会出来啊"
    因为
    <span id="MyRegValidtor1" style="color:Red;visibility:hidden;">数字<span id="ctl03" style="color:Red;visibility:hidden;">不可空</span></span>
    生成的
    myregvalidtor1的innerHTML=数字<span id="ctl03" style="color:Red;visibility:hidden;">不可空</span>
    可能是因为里面有Html代码所以不显示出来
      

  18.   

    但是他们两个的错误提示都没有出来啊
    =======
    可以出来.
    贴你的aspx页面的代码看看?
      

  19.   

    RequiredFieldValidator req = new RequiredFieldValidator();
                req.ControlToValidate = this.ControlToValidate;
                req.ErrorMessage = this.NotNullMessage;
                req.Display = this.Display;
                Literal l = new Literal();
                l.Text = this.ErrorMessage;
                this.Controls.Add(l);
                this.Controls.Add(req);<cc1:webRev ID="WebRev1" runat="server" Display="Dynamic"  ControlToValidate="TextBox1" ErrorMessage="数字" NotNullMessage="不可空" ValidationExpression="\d*"></cc1:webRev>因为加多了一个Display="Dynamic" 就不显示了
    但这个对我来说是很重要的
      

  20.   

    因为加多了 Display="Dynamic" 的时候
    当TextBox1为空的时候并没有验证WebRev1
    这时WebRev1的Display=none
    虽然这个时候验证了里面的RequiredFieldValidator控件,他的Display=""
    但是因为他包含在WebRev1中当WebRev1不显示的时候他自然就显示不出来了
      

  21.   

    using System;using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    namespace AA
    {
        /// <summary>
        /// MyRegValidtor 的摘要说明
        /// </summary>
        public class MyRegValidtor : System.Web.UI.WebControls.WebControl
        {
            public MyRegValidtor()
            {
                //
                // TODO: 在此处添加构造函数逻辑
                //
              
               
            }        protected override void OnInit(EventArgs e)
            {            
            }        protected override void OnDataBinding(EventArgs e)
            {         
                base.OnDataBinding(e);
            }        protected override void OnPreRender(EventArgs e)
            {            RequiredFieldValidator req = new RequiredFieldValidator();
                req.ControlToValidate = this.ControlToValidate;
                req.ErrorMessage = this.NotNullMessage;
                req.Display = this.Display;
                this.Controls.Add(req);            RegularExpressionValidator reg = new RegularExpressionValidator();
                reg.ControlToValidate = this.ControlToValidate;
                reg.ErrorMessage = this.ErrorMessage;
                reg.ValidationExpression = this.ValidationExpression;
                reg.Display = this.Display;
                this.Controls.Add(reg);           
               
            }        public string ErrorMessage
            {
                get
                {
                    return ViewState["ErrorMessage"] != null ? (string)ViewState["ErrorMessage"] : "";
                }            set
                {
                    ViewState["ErrorMessage"] = value;
                }
            }        public string ValidationExpression
            {
                get
                {
                    return ViewState["ValidationExpression"] != null ? (string)ViewState["ValidationExpression"] : "";
                }            set
                {
                    ViewState["ValidationExpression"] = value;
                }
            }
            public string ControlToValidate
            {
                get
                {
                    return ViewState["ControlToValidate"] != null ? (string)ViewState["ControlToValidate"] : "";
                }            set
                {
                    ViewState["ControlToValidate"] = value;
                }
            }        public ValidatorDisplay Display
            {
                get
                {
                    return ViewState["Display"] != null ? (ValidatorDisplay)ViewState["Display"] : ValidatorDisplay.None;
                }            set
                {
                    ViewState["Display"] = value;
                }
            }        public string NotNullMessage
            {
                get
                {
                    return ViewState["NotNullMessage"] != null ? (string)ViewState["NotNullMessage"] : "";
                }            set
                {
                    ViewState["NotNullMessage"] = value;
                }
            }    }
    }