C#Winform窗体工具类(六) 文本框数据校验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28254093/article/details/80455907

今天下午用一小会写了一个数据校验类,只需要调用即可,具体调用如下

  • 设置提示信息的形式 (可选)

如果不设置,则为MessageBox.Show("错误信息")的形式进行提示

//设置自定义错误提示方式,如果不设置,则为默认的弹出提示
RegexCheck.isCustomMsg = true;
RegexCheck.ShowMsg += (con, e) =>
{
	//自定义错误信息提示方式
	var _con=(Control)con;  //出现错误的控件
	var msg=((JEventArgs)e)msg.ToString()  //具体的错误信息
	//具体处理方式
};


  • 失去焦点验证 (方法一)
LogintextBox.RegexText(RegexEnum.Number, "用户名", false);
PasswordtextBox.RegexText(RegexEnum.Number, "密码", true);

  • 失去焦点验证 (方法二)
 this.RegexText(
                new Control[] {LogintextBox, PasswordtextBox},
                new RegexEnum[] {RegexEnum.Number, RegexEnum.Number},
                new string[] {"用户", "密码"},
                new bool[] {false, true}
                );

  • 保存数据时校验
//保存错误信息
var msg = "";
var flg = this.RegexSave(new Control[] { LogintextBox, PasswordtextBox }, ref msg);
if (!flg)
{
   //校验不同过时,具体处理
}


具体封装的类代码如下,为了更加清楚,类和枚举放在一起

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace DBUtility
{
    public static  class RegexCheck
    {
        /// <summary>
        /// 提供键值对的正则表达式
        /// </summary>
        private static Dictionary<RegexEnum,string> rege;

        /// <summary>
        /// 定义校验数据的正则表达式,后期可添加
        /// </summary>
        /// <param name="regexEnum"></param>
        /// <returns></returns>
        public static string Get(RegexEnum regexEnum)
        {
            rege = rege ?? new Dictionary<RegexEnum, string>
            {
                {RegexEnum.Phone,@"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|70)\d{8}$"},
                {RegexEnum.IDCard, @"^([1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3})|([1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx]))$"},
                {RegexEnum.Letter, @"^[A-Za-z]+$"},
                {RegexEnum.Number, @"^[0-9]+$"},
                {RegexEnum.LetterNumber, @"^[A-Za-z0-9]+$"},
                {RegexEnum.ChineseChar, @"^[\u4e00-\u9fa5]+$"},
                {RegexEnum.Email,  @"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"},
            };
            return rege[regexEnum];
        }
        /// <summary>
        /// 设置错误信息的背景色
        /// </summary>
        public static Color? ErrorColor { get; set; }

        /// <summary>
        /// 是否自定义错误提示信息,true时,调用 ShowMsg,false时使用系统默认提示
        /// </summary>
        public static bool isCustomMsg = false;
        /// <summary>
        /// 提示信息处理方法,可以单独定义并修改提示方式
        /// </summary>
        public static event EventHandler ShowMsg;

        private static void OnShowMsg(Control con,string msg)
        {
            var handler = ShowMsg;
            var jEvent = new JEventArgs()
            {
                msg = msg
            };
            if (handler != null) handler(con, jEvent);
        }
        /// <summary>
        /// 数据校验 单个控件
        /// </summary>
        /// <param name="con">需要校验的控件</param>
        /// <param name="regexEnum">需要校验的类型</param>
        /// <param name="msg">错误提示信息</param>
        /// <param name="isNotNull">是否非空校验</param>
        /// <returns></returns>
        public static bool RegexText(this Control con, RegexEnum regexEnum, string msg, bool isNotNull = false)
        {
            var isTrue = true;
            var oldColor = con.BackColor;
            con.Tag = regexEnum + "&" + msg + "&" + isNotNull;
            con.Leave += (sender, e) =>
            {
                isTrue=TextRegex(con, regexEnum, msg, isNotNull);
            };

            con.GotFocus += (sender, e) =>
            {
                con.BackColor = oldColor;
            };
            return isTrue;

        }

        /// <summary>
        /// 数据校验 一组控件
        /// </summary>
        /// <param name="form">扩展源</param>
        /// <param name="cons">需要校验的控件一组控件</param>
        /// <param name="regexEnum">需要校验的类型</param>
        /// <param name="msg">错误提示信息</param>
        /// <param name="isNotNull">是否非空校验</param>
        /// <returns></returns>
        public static bool RegexText(this Form form,Control [] cons, RegexEnum [] regexEnum, string [] msg, bool [] isNotNull)
        {
            for (var i = 0; i < cons.Length; i++)
            {
                var con = cons[i];
                var _msg = "输入非法";
                try{_msg = msg[i];}catch (Exception ex){}
                var isTrue = con.RegexText(regexEnum[i], _msg, isNotNull[i]);
                if (isTrue == false) return false;
            }
            return true;
        }

        /// <summary>
        /// 保存操作时多控件数据校验
        /// </summary>
        /// <param name="form"></param>
        /// <param name="cons"></param>
        /// <returns></returns>
        public static bool RegexSave(this Form form, Control[] cons,ref string msg)
        {
            foreach (var con in cons)
            {
                var valList=con.Tag.ToString().Split('&');
                msg = valList[1];
                var enumType = (RegexEnum)Enum.Parse(typeof(RegexEnum), valList[0]);
                var flg = TextRegex(con, enumType, valList[1], bool.Parse(valList[2]));
                if (flg == false)
                {
                    con.BackColor = ErrorColor ?? Color.AntiqueWhite;
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// 显示处理
        /// </summary>
        /// <param name="con"></param>
        /// <param name="msg"></param>
        private static void ShowMsgBox(Control con,string msg)
        {
            if (isCustomMsg)
            {
                OnShowMsg(con, msg);
            }
            else
            {
                MessageBox.Show(msg);
            }

        }


        /// <summary>
        /// 校验数据
        /// </summary>
        /// <param name="con">控件</param>
        /// <param name="isNotNull">是否校验非空值</param>
        /// <param name="msg">错误提示消息</param>
        /// <param name="regexEnum">校验类型</param>
        /// <returns></returns>
        private static bool TextRegex(Control con, RegexEnum regexEnum, string msg, bool isNotNull)
        {
            var _msg = "";
            var text = con.Text.Trim();
            #region 非空校验
            if (isNotNull == false && text == "") return true;
            if (isNotNull && text == "")
            {
                _msg = msg + "不能为空值!";
                con.BackColor = ErrorColor ?? Color.AntiqueWhite;
                ShowMsgBox(con, _msg);
                return false;
            }
            #endregion

            #region 正则校验
            var str = RegexCheck.Get(regexEnum);
            var regex = new Regex(str);
            var isTrue = regex.IsMatch(text);

            if (isTrue) return true;
            _msg = msg + "格式错误!";
            ShowMsgBox(con, _msg);
            con.BackColor = ErrorColor ?? Color.AntiqueWhite;
            return false;
            #endregion

        }
    }

 

    public enum RegexEnum
    {
        /// <summary>
        /// 电话号
        /// </summary>
        Phone,
        /// <summary>
        /// 字母
        /// </summary>
        Letter,
        /// <summary>
        /// 数字
        /// </summary>
        Number,
        /// <summary>
        /// 字母和数字
        /// </summary>
        LetterNumber,
        /// <summary>
        /// 身份证号
        /// </summary>
        IDCard,
        /// <summary>
        /// 电子邮件
        /// </summary>
        Email,
        /// <summary>
        /// 汉字
        /// </summary>
        ChineseChar,
    }


    public class JEventArgs : EventArgs
    {
        /// <summary>
        /// 存储错误信息
        /// </summary>
        public string msg;
    }

}



后期如果需要校验其他类型,只需添加枚举和校验的正则字典

以上代码可以粘贴复制到本地项目,在进行引用即可使用

猜你喜欢

转载自blog.csdn.net/qq_28254093/article/details/80455907