自定义控件(js弹出框方式和自带验证控件)验证textbox

       最近由于手头上有些工作一直耽误了进程,一直没有弄完。上次跟全哥说的贴出来一直没有贴出来。现在还是没有写完,但是基本上已经完成了。还有些小bug和细节问题。思路和程序框架都已经ok了,先贴出来供大家参考。如果疑问可以跟我联系。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ValidateTextBox
{
 //
<summary>
/// 重写的TextBox控件
/// Author: xs_shen(pine)
/// Date: 2007-12-1
/// Email: xs_shen@hnair.com or  sxs---01@126.com
/// QQ:  184397821
/// <summary>
     
   #region 枚举数据
             <summary>
             /// 验证数据类型
             /// </summary>
             public enum DataType
             {
              Never,               //不验证
              String,              //字符串
              Int,                 //整数
              IntPostive,          //大于0的整数
              IntZeroPostive,      //大于等于0的整数
              Float,               //数字
              FloatPostive,        //大于0的数字
              FloatZeroPostive,    //大于等于0的数字
              Url,                 //链接
              Mail,                //邮箱
              ChineseChars,        //汉字
              EnglishChars,        //英文
              EngNum,              //英文和数字
              EngNumUnerline,      //英文、数字和下划线
              PhoneNumber,         //电话号码
              MobileNumber,        //手机号码
              PostalCode,          //邮政编码
              Custom               //自定义正则式
             }
             <summary>
             /// 触发验证的事件,当为通过js方法alert弹出方式时使用
             /// </summary>           
            public enum ActionType
            {
                onClick,    //鼠标点击事件
                onSubmit,   //鼠标双击事件
                onDblClick, //鼠标上的按钮被按下了
                onMouseDown,//鼠标按下后,松开时激发的事件
                onMouseUp,  //鼠标按下后,松开时激发的事件
                onMouseOver,//当鼠标移动到某对象范围的上方时触发的事件
                onMouseMove,//鼠标移动时触发的事件
                onMouseOut, //当鼠标离开某对象范围时触发的事件
                onKeyPress, //键盘上的某个键被按下并且释放时触发的事件.[注意:页面内必须有被聚焦的对象]
                onKeyDown,  //当键盘上某个按键被按下时触发的事件[注意:页面内必须有被聚焦的对象]
                onKeyUp,    //当键盘上某个按键被按放开时触发的事件[注意:页面内必须有被聚焦的对象]
                onBlur,     //当前元素失去焦点时触发的事件
                onChange,   //当前元素失去焦点并且元素的内容发生改变而触发的事件 [鼠标与键盘的触发均可]
                onFocus,    //当某个元素获得焦点时触发的事件
                onReset     //当表单中RESET的属性被激发时触发的事件

            }
            public enum ValidType
            {
                JSAlert,       //采用js进行验证
                ServerValide   //采用服务器验证控件进行验证
            }
    #endregion 枚举数据完毕
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
    public class ValidateTextBox : System.Web.UI.WebControls.TextBox
    {
        private string error = "";

     #region 属性定义

        /// <summary>
        /// 验证的方式时js验证还是服务器控件进行验证
        /// </summary>
        [Bindable(true)]
        [Category("Data")]
        [Browsable(true)]
        [Description("在什么事件时触发验证")]
        [DefaultValue("IntPostive")]
        public ValidType validType
        {
            get { return ViewState["_validType"] == null ? "ServerValide" : ViewState["_validType"]; }
            set { ViewState["_validType"] = value; }
        }
        /// <summary>
        /// 验证的方式时js验证还是服务器控件进行验证
        /// </summary>
        [Bindable(true)]
        [Category("Data")]
        [Browsable(true)]
        [Description("是否允许为空")]
        [DefaultValue("IntPostive")]
        public bool AllowEmpty
        {
            get { return ViewState["AllowEmpty"] == null ? true : (bool)ViewState["AllowEmpty"]; }
            set { ViewState["AllowEmpty"] = value; }
        }
        /// <summary>
        /// 触发验证的控件
        /// </summary>
        [Bindable(true),
        Category("Data"), Description("触发验证的控件"),
        DefaultValue("")]
        public System.String ControlOfValidate
        {
            get { return ViewState["ControlOfValidate"] == null ? String.Empty : (string)ViewState["ControlOfValidate"]; }
            set { ViewState["ControlOfValidate"] = value; }
        }
        /// <summary>
        /// 错误信息提示的CSS类名
        /// </summary>
        [Bindable(true)]
        [Browsable(true)]
        [Category("自定义信息区")]
        [Description("错误信息提示的CSS类名")]
        [DefaultValue("")]
         public string CssError
         {
          get { return ViewState["CssError"] == null ? "" : (string)ViewState["CssError"] ; }
          set { ViewState["CssError"] = value; }
         }
        /// <summary>
        /// 触发验证的控件的事件名称
        /// </summary>
        [Bindable(true)]
        [Category("Data")]
        [Browsable(true)]
        [Description("在什么事件时触发验证")]
        [DefaultValue("IntPostive")]
        public ActionType actionType
        {
            get { return ViewState["actionType"] == null ? ActionType.onClick.ToString() : (String)ViewState["actionType"]; }
            set { ViewState["actionType"] = value; }
        }
        /// <summary>
        /// 为空时提示的错误信息
        /// </summary>
        [Bindable(true)]
        [Category("Data")]
        [Browsable(true)]
        [Description("为空错误信息")]
        [DefaultValue("IntPostive")]
        public String NullErrorMsg
        {
            get { return ViewState["NullErrorMsg"] == null ? "输入不能为空" : (String)ViewState["NullErrorMsg"]; }
            set { ViewState["NullErrorMsg"] = value; }
        }
        /// <summary>
        /// 格式错误时的错误信息
        /// </summary>
        [Bindable(true)]
        [Category("Data")]
        [Browsable(true)]
        [Description("为空错误信息")]
        [DefaultValue("IntPostive")]
        public String FormartErrorMsg
        {
            get { return ViewState["FormartErrorMsg"] == null ? "": (String)ViewState["FormartErrorMsg"]; }
            set { ViewState["FormartErrorMsg"] = value; }
        }
        /// <summary>
        /// 自定义正则式
        /// </summary>
        [Bindable(true)]
        [Category("Data")]
        [Browsable(true)]
        [Description("自定义正则式")]
        [DefaultValue("IntPostive")]
        public String ValidExpressionCustom
        {
            get { return ViewState["ValidExpressionCustom"] == null ? "": (String)ViewState["ValidExpressionCustom"]; }
            set { ViewState["ValidExpressionCustom"] = value; }
        }
      [Description("验证数据类型,默认为不验证")]
      [DefaultValue("IntPostive")]
      public DataType RessType
      {
          get { return ViewState["RessType"] == null ? DataType.Never : (DataType)ViewState["RessType"]; }
          set { ViewState["RessType"] = value; }
      }
        #endregion  属性定义完毕

     #region 构造函数,初始化子控件
          /// <summary>
        /// 初始化子控件
        /// </summary>
        private System.Web.UI.WebControls.RequiredFieldValidator rfvDataInput = new RequiredFieldValidator();
        private System.Web.UI.WebControls.RegularExpressionValidator revDataInput = new RegularExpressionValidator();
        private Panel pnlFrame = new Panel();    

        public ValidateTextBox()
        {
 
        }
        #endregion 构造函数完毕


        protected override void RenderContents(HtmlTextWriter output)
        {

        }

        protected override void EnsureChildControls()
        {
            if (this.validType == ValidType.ServerValide)
            {
                this.rfvDataInput.CssClass = this.CssError;
                this.rfvDataInput.ErrorMessage = "*输入不能为空";
                this.rfvDataInput.Display = System.Web.UI.WebControls.ValidatorDisplay.Dynamic;
                this.rfvDataInput.EnableViewState = true;
                this.rfvDataInput.ControlToValidate = base.ID;

                this.revDataInput.CssClass = this.CssError;
                this.revDataInput.ErrorMessage = "*输入格式错误";
                this.revDataInput.Display = System.Web.UI.WebControls.ValidatorDisplay.Dynamic;
                this.revDataInput.EnableViewState = true;
                this.revDataInput.ControlToValidate = base.ID;
                //将子控件添加到此自定义控件中
                this.Controls.Add(rfvDataInput);
                this.Controls.Add(revDataInput);
                this.Controls.Add(pnlFrame);
            }
            else
            {
                this.Controls.Add(pnlFrame);
                this.getString();
            }
        }

 #region 向页面写如控件

        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(writer);
            writer.Write("&nbsp;");
            if (this.validType == ValidType.ServerValide)
            {
                if (!this.AllowEmpty)
                {
                    this.rfvDataInput.ID = "rfv" + base.ID;
                    this.rfvDataInput.ControlToValidate = base.ID;
                    this.rfvDataInput.RenderControl(writer);
                }

                if (this.RessType != DataType.Never && this.RessType != DataType.String)
                {
                    this.revDataInput.ID = "rev" + base.ID;
                    this.revDataInput.ControlToValidate = base.ID;
                    this.revDataInput.ValidationExpression = this.GetValidRegex();
                    this.revDataInput.ErrorMessage = error;
                    this.revDataInput.RenderControl(writer);
                }
            }
            else
            {
                System.Web.UI.ClientScriptManager client = this.Page.ClientScript;
                Type cstype = Page.GetType();
                client.RegisterStartupScript(cstype, base.ID + "_validate", getString());
                this.pnlFrame.RenderControl(writer);

            }
      
        }
    #endregion 向页面写入控件完
 #region 得到正则式
          private string GetValidRegex()
          {
           string regex = @"(/S)";
           switch (this.RessType)
           {
            case DataType.Never :
             break;
            case DataType.Int :
             error = "*必须为整数";
             regex = @"(-)?(/d+)";
             break;
            case DataType.IntPostive :
             error = "*必须为大于0的整数";
             regex = @"([1-9]{1}/d*)";
             break;
            case DataType.IntZeroPostive :
             error = "*必须为不小于0的整数";
             regex = @"(/d+)";
             break;
            case DataType.Float :
             error = "*必须为数字";
             regex = @"(-)?(/d+)(((/.)(/d)+))?";
             break;
            case DataType.FloatPostive :
             error = "*必须为大于0的数字";
             regex = @"(/d+)(((/.)(/d)+))?";
             break;
            case DataType.FloatZeroPostive :
             error = "*必须为不小于0的数字";
             regex = @"(/d+)(((/.)(/d)+))?";
             break;
            case DataType.Url :
             error = "*URL格式错误";
             regex = @"(http://)?([/w-]+/.)+[/w-]+(/[/w- ./?%&=]*)?";
             break;
            case DataType.Mail :
             error = "*EMail格式错误";
             regex = @"/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*";
             break;
        //    case DataType.ChineseChars :
        //     error = "*包含中文字符";
        //     regex = @"[^/x00-/xff]";
        //     break;
            case DataType.EnglishChars :
             error = "*只能输入英文字符";
             regex = @"[a-zA-Z]*";
             break;
            case DataType.EngNum :
             error = "*只能输入英文字符和数字";
             regex = @"[a-zA-Z0-9]*";
             break;
            case DataType.EngNumUnerline :
             error = "*只能输入英文字符、数字和下划线";
             regex = @"[a-zA-Z0-9_]*";
             break;
            case DataType.PhoneNumber :
             error = "*电话号码格式错误";
             regex = @"(86)?(-)?(0/d{2,3})?(-)?(/d{7,8})(-)?(/d{1,5})?";
             break;
            case DataType.MobileNumber :
             error = "*手机号码格式错误";
             regex = @"(0)?(13)/d{9}";
             break;
            case DataType.PostalCode :
             error = "*邮编格式错误";
             regex = @"/d{6}";
             break;
            case DataType.Custom :
             error = "*格式错误";
             regex = this.ValidExpressionCustom;
             break;
            default:
             break;
           }
           if(this.FormartErrorMsg.Trim() != "")
               error = this.FormartErrorMsg;
           return regex;
          }
     #endregion
        #region 当为js验证的时候向页面输出的脚本

        private string getString()
        {
            string strScript = @"<script language='javascript'>
            function
                  newElement()
                 {
                    if(!document.getElementById('newP')){
                    var newElem = document.createElement('input');
                    newElem.setAttribute('id','newP');//newElem.id = 'newP';
                    newElem.setAttribute('value','0');//newElem.id = 'newP';
                    newElem.setAttribute('type','hidden');//newElem.id = 'newP';
                    document.body.appendChild(newElem);
                  }

                function  " + base.ID + @"_check(){
                 if(if(document.getElementById('newP').value=='已显示'))
                {
                        return false;
                }
                var obj=document.getElementById('" + base.ID + "_" + @"');
                var strTemp=obj.value;
                strTemp=strTemp.replace(/^(/s)*|(/s)*$/g,'');//去掉字符串两边的空格
             if (strTemp.length<1)
       {
  
                    alert('" + this.NullErrorMsg + @"');

                    document.getElementById('newP')='已显示';
                    return false;
                }
                }
               window.attachEvent('onload'," + base.ID+@"_enter);
                function()" + base.ID + @"_enter(){
                 newElement();
                document.getElementById('";
            strScript += this.ControlOfValidate + "').attachEvent('" + GetAction() +"'," + base.ID + @"_check);
                }
                </script> ";
            return strScript;
        }
        #endregion  输出脚本完
 #region 得到具体的事件
        private string GetAction()
        {
           
            switch (this.actionType)
            {
                case ActionType.onBlur:
                    return "onBlur";
                case ActionType.onChange:
                    return "onChange";
                 
                case ActionType.onClick :
                    return "onClick";
                case ActionType.onDblClick :
                    return "onDblClick";
                case ActionType.onFocus :
                    return "onFocus";
                case ActionType.onKeyDown :
                    return "onKeyDown";
                case ActionType.onKeyPress :
                    return "onKeyPress";
                case ActionType.onKeyUp:
                    return "onKeyUp";
                case ActionType.onMouseDown:
                    return "";
                case ActionType.onMouseMove:
                    return "onMouseDown";
                case ActionType.onMouseOut:
                    return "onMouseOut";
                case ActionType.onMouseOver:
                    return "onMouseOver";
                case ActionType.onMouseUp:
                    return "onMouseUp";
                case ActionType.onReset:
                    return "onReset";
                case ActionType.onSubmit:
                    return "onSubmit";
                default:
                    return "onclick";
            }

        }
 #endregion
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值