(七十六)c#Winform自定义控件-表单验证组件-HZHControls

用处及效果

准备工作

思路如下:

1、确定哪些控件需要进行验证,在组件中进行属性扩展

2、定义验证规则

3、根据验证规则的正则表达式进行验证和非空验证

4、触发验证结果事件

5、进行验证结果提示

开始

添加一个验证规则枚举

/// <summary>
    /// 验证规则
    /// </summary>
    public enum VerificationModel
    {
        /// <summary>
        /// 无
        /// </summary>
        [Description("无"), VerificationAttribute()]
        None = 1,
        /// <summary>
        /// 任意字母数字下划线
        /// </summary>
        [Description("任意字母数字下划线"), VerificationAttribute(@"^[a-zA-Z_0-1]*$", "请输入任意字母数字下划线")]
        AnyChar = 2,
        /// <summary>
        /// 任意数字
        /// </summary>
        [Description("任意数字"), VerificationAttribute(@"^[-+]?d+(.d+)?$", "请输入任意数字")]
        Number = 4,
        /// <summary>
        /// 非负数
        /// </summary>
        [Description("非负数"), VerificationAttribute(@"^(+)?d+(.d+)?$", "请输入非负数")]
        UnsignNumber = 8,
        /// <summary>
        /// 正数
        /// </summary>
        [Description("正数"), VerificationAttribute(@"(+)?([1-9][0-9]*(.d{1,2})?)|(0.d{1,2})", "请输入正数")]
        PositiveNumber = 16,
        /// <summary>
        /// 整数
        /// </summary>
        [Description("整数"), VerificationAttribute(@"^[+-]?d+$", "请输入整数")]
        Integer = 32,
        /// <summary>
        /// 非负整数
        /// </summary>
        [Description("非负整数"), VerificationAttribute(@"^(+)?d+$", "请输入非负整数")]
        UnsignIntegerNumber = 64,
        /// <summary>
        /// 正整数
        /// </summary>
        [Description("正整数"), VerificationAttribute(@"^[0-9]*[1-9][0-9]*$", "请输入正整数")]
        PositiveIntegerNumber = 128,
        /// <summary>
        /// 邮箱
        /// </summary>
        [Description("邮箱"), VerificationAttribute(@"^(([0-9a-zA-Z]+)|([0-9a-zA-Z]+[_.0-9a-zA-Z-]*[0-9a-zA-Z]+))@([a-zA-Z0-9-]+[.])+([a-zA-Z]{2}|net|NET|com|COM|gov|GOV|mil|MIL|org|ORG|edu|EDU|int|INT)$", "请输入正确的邮箱地址")]
        Email = 256,
        /// <summary>
        /// 手机
        /// </summary>
        [Description("手机"), VerificationAttribute(@"^(+?86)?1d{10}$", "请输入正确的手机号")]
        Phone = 512,
        /// <summary>
        /// IP
        /// </summary>
        [Description("IP"), VerificationAttribute(@"(?=(b|D))(((d{1,2})|(1d{1,2})|(2[0-4]d)|(25[0-5])).){3}((d{1,2})|(1d{1,2})|(2[0-4]d)|(25[0-5]))(?=(b|D))", "请输入正确的IP地址")]
        IP = 1024,
        /// <summary>
        /// Url
        /// </summary>
        [Description("Url"), VerificationAttribute(@"^[a-zA-z]+://(//w+(-//w+)*)(//.(//w+(-//w+)*))*(//?//S*)?$", "请输入正确的网址")]
        URL = 2048,
        /// <summary>
        /// 身份证号
        /// </summary>
        [Description("身份证号"), VerificationAttribute(@"^[1-9]d{5}(18|19|([23]d))d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$", "请输入正确的身份证号")]
        IDCardNo = 4096,
        /// <summary>
        /// 正则验证
        /// </summary>
        [Description("自定义正则表达式"), VerificationAttribute()]
        Custom = 8192,
    }

还有一个验证规则枚举的特性

public class VerificationAttribute : Attribute
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="VerificationAttribute"/> class.
        /// </summary>
        /// <param name="strRegex">The string regex.</param>
        /// <param name="strErrorMsg">The string error MSG.</param>
        public VerificationAttribute(string strRegex = "", string strErrorMsg = "")
        {
            Regex = strRegex;
            ErrorMsg = strErrorMsg;
        }
        /// <summary>
        /// Gets or sets the regex.
        /// </summary>
        /// <value>The regex.</value>
        public string Regex { get; set; }
        /// <summary>
        /// Gets or sets the error MSG.
        /// </summary>
        /// <value>The error MSG.</value>
        public string ErrorMsg { get; set; }

    }

定义事件参数

public class VerificationEventArgs : EventArgs
    {
        /// <summary>
        /// Gets or sets the verification control.
        /// </summary>
        /// <value>The verification control.</value>
        public Control VerificationControl { get; set; }
        /// <summary>
        /// Gets or sets a value indicating whether [verify success].
        /// </summary>
        /// <value><c>true</c> if [verify success]; otherwise, <c>false</c>.</value>
        public bool IsVerifySuccess { get; set; }
        /// <summary>
        /// Gets or sets the verification model.
        /// </summary>
        /// <value>The verification model.</value>
        public VerificationModel VerificationModel { get; set; }
        /// <summary>
        /// 是否已处理,如果为true,则不再使用默认验证提示功能
        /// </summary>
        /// <value><c>true</c> if this instance is processed; otherwise, <c>false</c>.</value>
        public bool IsProcessed { get; set; }
        /// <summary>
        /// Gets or sets 正则表达式
        /// </summary>
        /// <value>The custom regex.</value>
        public string Regex { get; set; }
        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="VerificationEventArgs"/> is required.
        /// </summary>
        /// <value><c>true</c> if required; otherwise, <c>false</c>.</value>
        public bool Required { get; set; }

        /// <summary>
        /// Gets or sets the error MSG.
        /// </summary>
        /// <value>The error MSG.</value>
        public string ErrorMsg { get; set; }
    }

添加一个类VerificationComponent继承Component,实现接口 IExtenderProvider以对控件进行扩展

定义属性

/// <summary>
        /// Delegate VerificationedHandle
        /// </summary>
        /// <param name="e">The <see cref="VerificationEventArgs"/> instance containing the event data.</param>
        public delegate void VerificationedHandle(VerificationEventArgs e);
        /// <summary>
        /// Occurs when [verificationed].
        /// </summary>
        [Browsable(true), Category("自定义属性"), Description("验证事件"), Localizable(true)]
        public event VerificationedHandle Verificationed;

        /// <summary>
        /// The m control cache
        /// </summary>
        Dictionary<Control, VerificationModel> m_controlCache = new Dictionary<Control, VerificationModel>();
        /// <summary>
        /// The m control regex cache
        /// </summary>
        Dictionary<Control, string> m_controlRegexCache = new Dictionary<Control, string>();
        /// <summary>
        /// The m control required cache
        /// </summary>
        Dictionary<Control, bool> m_controlRequiredCache = new Dictionary<Control, bool>();
        /// <summary>
        /// The m control MSG cache
        /// </summary>
        Dictionary<Control, string> m_controlMsgCache = new Dictionary<Control, string>();
        /// <summary>
        /// The m control tips
        /// </summary>
        Dictionary<Control, Forms.FrmAnchorTips> m_controlTips = new Dictionary<Control, Forms.FrmAnchorTips>();

        /// <summary>
        /// The error tips back color
        /// </summary>
        private Color errorTipsBackColor = Color.FromArgb(255, 77, 58);

        /// <summary>
        /// Gets or sets the color of the error tips back.
        /// </summary>
        /// <value>The color of the error tips back.</value>
        [Browsable(true), Category("自定义属性"), Description("错误提示背景色"), Localizable(true)]
        public Color ErrorTipsBackColor
        {
            get { return errorTipsBackColor; }
            set { errorTipsBackColor = value; }
        }

        /// <summary>
        /// The error tips fore color
        /// </summary>
        private Color errorTipsForeColor = Color.White;

        /// <summary>
        /// Gets or sets the color of the error tips fore.
        /// </summary>
        /// <value>The color of the error tips fore.</value>
        [Browsable(true), Category("自定义属性"), Description("错误提示文字颜色"), Localizable(true)]
        public Color ErrorTipsForeColor
        {
            get { return errorTipsForeColor; }
            set { errorTipsForeColor = value; }
        }

哪些控件需要进行验证(属性扩展)

public bool CanExtend(object extendee)
        {
            if (extendee is TextBoxBase || extendee is UCTextBoxEx || extendee is ComboBox || extendee is UCCombox)
            {
                return true;
            }
            return false;
        }

扩展属性

/// <summary>
        /// The m control cache
        /// </summary>
        Dictionary<Control, VerificationModel> m_controlCache = new Dictionary<Control, VerificationModel>();
        /// <summary>
        /// The m control regex cache
        /// </summary>
        Dictionary<Control, string> m_controlRegexCache = new Dictionary<Control, string>();
        /// <summary>
        /// The m control required cache
        /// </summary>
        Dictionary<Control, bool> m_controlRequiredCache = new Dictionary<Control, bool>();
        /// <summary>
        /// The m control MSG cache
        /// </summary>
        Dictionary<Control, string> m_controlMsgCache = new Dictionary<Control, string>();

  #region 验证规则    English:Validation rule
        /// <summary>
        /// Gets the verification model.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <returns>VerificationModel.</returns>
        [Browsable(true), Category("自定义属性"), Description("验证规则"), DisplayName("VerificationModel"), Localizable(true)]
        public VerificationModel GetVerificationModel(Control control)
        {
            if (m_controlCache.ContainsKey(control))
            {
                return m_controlCache[control];
            }
            else
                return VerificationModel.None;
        }

        /// <summary>
        /// Sets the verification model.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <param name="vm">The vm.</param>
        public void SetVerificationModel(Control control, VerificationModel vm)
        {
            m_controlCache[control] = vm;
        }
        #endregion

        #region 自定义正则    English:Custom Rules
        /// <summary>
        /// Gets the verification custom regex.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <returns>System.String.</returns>
        [Browsable(true), Category("自定义属性"), Description("自定义验证正则表达式"), DisplayName("VerificationCustomRegex"), Localizable(true)]
        public string GetVerificationCustomRegex(Control control)
        {
            if (m_controlRegexCache.ContainsKey(control))
            {
                return m_controlRegexCache[control];
            }
            else
                return "";
        }

        /// <summary>
        /// Sets the verification custom regex.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <param name="strRegex">The string regex.</param>
        public void SetVerificationCustomRegex(Control control, string strRegex)
        {
            m_controlRegexCache[control] = strRegex;
        }
        #endregion

        #region 必填    English:Must fill
        /// <summary>
        /// Gets the verification required.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        [Browsable(true), Category("自定义属性"), Description("是否必填项"), DisplayName("VerificationRequired"), Localizable(true)]
        public bool GetVerificationRequired(Control control)
        {
            if (m_controlRequiredCache.ContainsKey(control))
                return m_controlRequiredCache[control];
            return false;
        }

        /// <summary>
        /// Sets the verification required.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <param name="blnRequired">if set to <c>true</c> [BLN required].</param>
        public void SetVerificationRequired(Control control, bool blnRequired)
        {
            m_controlRequiredCache[control] = blnRequired;
        }
        #endregion

        #region 提示信息    English:Prompt information
        /// <summary>
        /// Gets the verification error MSG.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <returns>System.String.</returns>
        [Browsable(true), Category("自定义属性"), Description("验证错误提示信息,当为空时则使用默认提示信息"), DisplayName("VerificationErrorMsg"), Localizable(true)]
        public string GetVerificationErrorMsg(Control control)
        {
            if (m_controlMsgCache.ContainsKey(control))
                return m_controlMsgCache[control];
            return "";
        }

        /// <summary>
        /// Sets the verification error MSG.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <param name="strErrorMsg">The string error MSG.</param>
        public void SetVerificationErrorMsg(Control control, string strErrorMsg)
        {
            m_controlMsgCache[control] = strErrorMsg;
        }
        #endregion

验证处理

#region 验证    English:Verification
        /// <summary>
        /// 功能描述:验证    English:Verification result processing
        /// 作  者:HZH
        /// 创建日期:2019-09-28 09:02:49
        /// 任务编号:POS
        /// </summary>
        /// <param name="c">c</param>
        /// <returns>返回值</returns>
        public bool Verification(Control c)
        {
            bool bln = true;
            if (m_controlCache.ContainsKey(c))
            {
                var vm = m_controlCache[c];
                string strRegex = "";
                string strErrMsg = "";
                #region 获取正则或默认错误提示    English:Get regular or error prompts
                if (vm == VerificationModel.Custom)
                {
                    //自定义正则
                    if (m_controlRegexCache.ContainsKey(c))
                    {
                        strRegex = m_controlRegexCache[c];
                        strErrMsg = "不正确的输入";
                    }
                }
                else
                {
                    //获取默认正则和错误提示
                    Type type = vm.GetType();   //获取类型  
                    MemberInfo[] memberInfos = type.GetMember(vm.ToString());
                    if (memberInfos.Length > 0)
                    {
                        var atts = memberInfos[0].GetCustomAttributes(typeof(VerificationAttribute), false);
                        if (atts.Length > 0)
                        {
                            var va = ((VerificationAttribute)atts[0]);
                            strErrMsg = va.ErrorMsg;
                            strRegex = va.Regex;
                        }
                    }
                }
                #endregion

                #region 取值    English:Value
                string strValue = "";
                if (c is TextBoxBase)
                {
                    strValue = (c as TextBoxBase).Text;
                }
                else if (c is UCTextBoxEx)
                {
                    strValue = (c as UCTextBoxEx).InputText;
                }
                else if (c is ComboBox)
                {
                    var cbo = (c as ComboBox);
                    if (cbo.DropDownStyle == ComboBoxStyle.DropDownList)
                    {
                        strValue = cbo.SelectedItem == null ? "" : cbo.SelectedValue.ToString();
                    }
                    else
                    {
                        strValue = cbo.Text;
                    }
                }
                else if (c is UCCombox)
                {
                    strValue = (c as UCCombox).SelectedText;
                }
                #endregion

                //自定义错误信息
                if (m_controlMsgCache.ContainsKey(c) && !string.IsNullOrEmpty(m_controlMsgCache[c]))
                    strErrMsg = m_controlMsgCache[c];

                //检查必填项
                if (m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c])
                {
                    if (string.IsNullOrEmpty(strValue))
                    {
                        VerControl(new VerificationEventArgs()
                        {
                            VerificationModel = vm,
                            Regex = strRegex,
                            ErrorMsg = "不能为空",
                            IsVerifySuccess = false,
                            Required = true,
                            VerificationControl = c
                        });
                        bln = false;
                        return false;
                    }
                }
                //验证正则
                if (!string.IsNullOrEmpty(strValue))
                {
                    if (!string.IsNullOrEmpty(strRegex))
                    {
                        if (!Regex.IsMatch(strValue, strRegex))
                        {
                            VerControl(new VerificationEventArgs()
                            {
                                VerificationModel = vm,
                                Regex = strRegex,
                                ErrorMsg = strErrMsg,
                                IsVerifySuccess = false,
                                Required = m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c],
                                VerificationControl = c
                            });
                            bln = false;
                            return false;
                        }
                    }
                }
                //没有问题出发一个成功信息
                VerControl(new VerificationEventArgs()
                {
                    VerificationModel = vm,
                    Regex = strRegex,
                    ErrorMsg = strErrMsg,
                    IsVerifySuccess = true,
                    Required = m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c],
                    VerificationControl = c
                });
            }
            return bln;
        }
        #endregion
        #region 验证    English:Verification
        /// <summary>
        /// 功能描述:验证    English:Verification
        /// 作  者:HZH
        /// 创建日期:2019-09-27 17:54:38
        /// 任务编号:POS
        /// </summary>
        /// <returns>返回值</returns>
        public bool Verification()
        {
            bool bln = true;
            foreach (var item in m_controlCache)
            {
                Control c = item.Key;
                if (!Verification(c))
                {
                    bln = false;
                }
            }
            return bln;
        }
        #endregion



        #region 验证结果处理    English:Verification result processing
        /// <summary>
        /// 功能描述:验证结果处理    English:Verification result processing
        /// 作  者:HZH
        /// 创建日期:2019-09-27 17:54:59
        /// 任务编号:POS
        /// </summary>
        /// <param name="e">e</param>
        private void VerControl(VerificationEventArgs e)
        {
            //如果成功则移除失败提示
            if (e.IsVerifySuccess)
            {
                if (m_controlTips.ContainsKey(e.VerificationControl))
                {
                    m_controlTips[e.VerificationControl].Close();
                    m_controlTips.Remove(e.VerificationControl);
                }
            }
            //触发事件
            if (Verificationed != null)
            {
                Verificationed(e);
                if (e.IsProcessed)//如果已处理,则不再向下执行
                {
                    return;
                }
            }
            //如果失败则显示提示
            if (!e.IsVerifySuccess)
            {
                if (m_controlTips.ContainsKey(e.VerificationControl))
                {
                    m_controlTips[e.VerificationControl].StrMsg = e.ErrorMsg;
                }
                else
                {
                    var tips = Forms.FrmAnchorTips.ShowTips(e.VerificationControl, e.ErrorMsg, background: errorTipsBackColor, foreColor: errorTipsForeColor, autoCloseTime: 0, blnTopMost: false);
                    m_controlTips[e.VerificationControl] = tips;
                }
            }
        }
        #endregion

完整代码

// ***********************************************************************
// Assembly         : HZH_Controls
// Created          : 2019-09-27
//
// ***********************************************************************
// <copyright file="VerificationComponent.cs">
//     Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
// </copyright>
//
// Blog: https://www.cnblogs.com/bfyx
// GitHub:https://github.com/kwwwvagaa/NetWinformControl
// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
//
// If you use this code, please keep this note.
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace HZH_Controls.Controls
{
    /// <summary>
    /// Class VerificationComponent.
    /// Implements the <see cref="System.ComponentModel.Component" />
    /// Implements the <see cref="System.ComponentModel.IExtenderProvider" />
    /// </summary>
    /// <seealso cref="System.ComponentModel.Component" />
    /// <seealso cref="System.ComponentModel.IExtenderProvider" />
    [ProvideProperty("VerificationModel", typeof(Control))]
    [ProvideProperty("VerificationCustomRegex", typeof(Control))]
    [ProvideProperty("VerificationRequired", typeof(Control))]
    [ProvideProperty("VerificationErrorMsg", typeof(Control))]
    [DefaultEvent("Verificationed")]
    public class VerificationComponent : Component, IExtenderProvider
    {
        /// <summary>
        /// Delegate VerificationedHandle
        /// </summary>
        /// <param name="e">The <see cref="VerificationEventArgs"/> instance containing the event data.</param>
        public delegate void VerificationedHandle(VerificationEventArgs e);
        /// <summary>
        /// Occurs when [verificationed].
        /// </summary>
        [Browsable(true), Category("自定义属性"), Description("验证事件"), Localizable(true)]
        public event VerificationedHandle Verificationed;

        /// <summary>
        /// The m control cache
        /// </summary>
        Dictionary<Control, VerificationModel> m_controlCache = new Dictionary<Control, VerificationModel>();
        /// <summary>
        /// The m control regex cache
        /// </summary>
        Dictionary<Control, string> m_controlRegexCache = new Dictionary<Control, string>();
        /// <summary>
        /// The m control required cache
        /// </summary>
        Dictionary<Control, bool> m_controlRequiredCache = new Dictionary<Control, bool>();
        /// <summary>
        /// The m control MSG cache
        /// </summary>
        Dictionary<Control, string> m_controlMsgCache = new Dictionary<Control, string>();
        /// <summary>
        /// The m control tips
        /// </summary>
        Dictionary<Control, Forms.FrmAnchorTips> m_controlTips = new Dictionary<Control, Forms.FrmAnchorTips>();

        /// <summary>
        /// The error tips back color
        /// </summary>
        private Color errorTipsBackColor = Color.FromArgb(255, 77, 58);

        /// <summary>
        /// Gets or sets the color of the error tips back.
        /// </summary>
        /// <value>The color of the error tips back.</value>
        [Browsable(true), Category("自定义属性"), Description("错误提示背景色"), Localizable(true)]
        public Color ErrorTipsBackColor
        {
            get { return errorTipsBackColor; }
            set { errorTipsBackColor = value; }
        }

        /// <summary>
        /// The error tips fore color
        /// </summary>
        private Color errorTipsForeColor = Color.White;

        /// <summary>
        /// Gets or sets the color of the error tips fore.
        /// </summary>
        /// <value>The color of the error tips fore.</value>
        [Browsable(true), Category("自定义属性"), Description("错误提示文字颜色"), Localizable(true)]
        public Color ErrorTipsForeColor
        {
            get { return errorTipsForeColor; }
            set { errorTipsForeColor = value; }
        }

        #region 构造函数    English:Constructor
        /// <summary>
        /// Initializes a new instance of the <see cref="VerificationComponent"/> class.
        /// </summary>
        public VerificationComponent()
        {

        }

        /// <summary>
        /// Initializes a new instance of the <see cref="VerificationComponent"/> class.
        /// </summary>
        /// <param name="container">The container.</param>
        public VerificationComponent(IContainer container)
            : this()
        {
            container.Add(this);
        }
        #endregion

        #region 指定此对象是否可以将其扩展程序属性提供给指定的对象。    English:Specifies whether this object can provide its extender properties to the specified object.
        /// <summary>
        /// 指定此对象是否可以将其扩展程序属性提供给指定的对象。
        /// </summary>
        /// <param name="extendee">要接收扩展程序属性的 <see cref="T:System.Object" />。</param>
        /// <returns>如果此对象可以扩展程序属性提供给指定对象,则为 true;否则为 false。</returns>
        public bool CanExtend(object extendee)
        {
            if (extendee is TextBoxBase || extendee is UCTextBoxEx || extendee is ComboBox || extendee is UCCombox)
            {
                return true;
            }
            return false;
        }
        #endregion

        #region 验证规则    English:Validation rule
        /// <summary>
        /// Gets the verification model.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <returns>VerificationModel.</returns>
        [Browsable(true), Category("自定义属性"), Description("验证规则"), DisplayName("VerificationModel"), Localizable(true)]
        public VerificationModel GetVerificationModel(Control control)
        {
            if (m_controlCache.ContainsKey(control))
            {
                return m_controlCache[control];
            }
            else
                return VerificationModel.None;
        }

        /// <summary>
        /// Sets the verification model.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <param name="vm">The vm.</param>
        public void SetVerificationModel(Control control, VerificationModel vm)
        {
            m_controlCache[control] = vm;
        }
        #endregion

        #region 自定义正则    English:Custom Rules
        /// <summary>
        /// Gets the verification custom regex.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <returns>System.String.</returns>
        [Browsable(true), Category("自定义属性"), Description("自定义验证正则表达式"), DisplayName("VerificationCustomRegex"), Localizable(true)]
        public string GetVerificationCustomRegex(Control control)
        {
            if (m_controlRegexCache.ContainsKey(control))
            {
                return m_controlRegexCache[control];
            }
            else
                return "";
        }

        /// <summary>
        /// Sets the verification custom regex.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <param name="strRegex">The string regex.</param>
        public void SetVerificationCustomRegex(Control control, string strRegex)
        {
            m_controlRegexCache[control] = strRegex;
        }
        #endregion

        #region 必填    English:Must fill
        /// <summary>
        /// Gets the verification required.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        [Browsable(true), Category("自定义属性"), Description("是否必填项"), DisplayName("VerificationRequired"), Localizable(true)]
        public bool GetVerificationRequired(Control control)
        {
            if (m_controlRequiredCache.ContainsKey(control))
                return m_controlRequiredCache[control];
            return false;
        }

        /// <summary>
        /// Sets the verification required.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <param name="blnRequired">if set to <c>true</c> [BLN required].</param>
        public void SetVerificationRequired(Control control, bool blnRequired)
        {
            m_controlRequiredCache[control] = blnRequired;
        }
        #endregion

        #region 提示信息    English:Prompt information
        /// <summary>
        /// Gets the verification error MSG.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <returns>System.String.</returns>
        [Browsable(true), Category("自定义属性"), Description("验证错误提示信息,当为空时则使用默认提示信息"), DisplayName("VerificationErrorMsg"), Localizable(true)]
        public string GetVerificationErrorMsg(Control control)
        {
            if (m_controlMsgCache.ContainsKey(control))
                return m_controlMsgCache[control];
            return "";
        }

        /// <summary>
        /// Sets the verification error MSG.
        /// </summary>
        /// <param name="control">The control.</param>
        /// <param name="strErrorMsg">The string error MSG.</param>
        public void SetVerificationErrorMsg(Control control, string strErrorMsg)
        {
            m_controlMsgCache[control] = strErrorMsg;
        }
        #endregion


        #region 验证    English:Verification
        /// <summary>
        /// 功能描述:验证    English:Verification result processing
        /// 作  者:HZH
        /// 创建日期:2019-09-28 09:02:49
        /// 任务编号:POS
        /// </summary>
        /// <param name="c">c</param>
        /// <returns>返回值</returns>
        public bool Verification(Control c)
        {
            bool bln = true;
            if (m_controlCache.ContainsKey(c))
            {
                var vm = m_controlCache[c];
                string strRegex = "";
                string strErrMsg = "";
                #region 获取正则或默认错误提示    English:Get regular or error prompts
                if (vm == VerificationModel.Custom)
                {
                    //自定义正则
                    if (m_controlRegexCache.ContainsKey(c))
                    {
                        strRegex = m_controlRegexCache[c];
                        strErrMsg = "不正确的输入";
                    }
                }
                else
                {
                    //获取默认正则和错误提示
                    Type type = vm.GetType();   //获取类型  
                    MemberInfo[] memberInfos = type.GetMember(vm.ToString());
                    if (memberInfos.Length > 0)
                    {
                        var atts = memberInfos[0].GetCustomAttributes(typeof(VerificationAttribute), false);
                        if (atts.Length > 0)
                        {
                            var va = ((VerificationAttribute)atts[0]);
                            strErrMsg = va.ErrorMsg;
                            strRegex = va.Regex;
                        }
                    }
                }
                #endregion

                #region 取值    English:Value
                string strValue = "";
                if (c is TextBoxBase)
                {
                    strValue = (c as TextBoxBase).Text;
                }
                else if (c is UCTextBoxEx)
                {
                    strValue = (c as UCTextBoxEx).InputText;
                }
                else if (c is ComboBox)
                {
                    var cbo = (c as ComboBox);
                    if (cbo.DropDownStyle == ComboBoxStyle.DropDownList)
                    {
                        strValue = cbo.SelectedItem == null ? "" : cbo.SelectedValue.ToString();
                    }
                    else
                    {
                        strValue = cbo.Text;
                    }
                }
                else if (c is UCCombox)
                {
                    strValue = (c as UCCombox).SelectedText;
                }
                #endregion

                //自定义错误信息
                if (m_controlMsgCache.ContainsKey(c) && !string.IsNullOrEmpty(m_controlMsgCache[c]))
                    strErrMsg = m_controlMsgCache[c];

                //检查必填项
                if (m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c])
                {
                    if (string.IsNullOrEmpty(strValue))
                    {
                        VerControl(new VerificationEventArgs()
                        {
                            VerificationModel = vm,
                            Regex = strRegex,
                            ErrorMsg = "不能为空",
                            IsVerifySuccess = false,
                            Required = true,
                            VerificationControl = c
                        });
                        bln = false;
                        return false;
                    }
                }
                //验证正则
                if (!string.IsNullOrEmpty(strValue))
                {
                    if (!string.IsNullOrEmpty(strRegex))
                    {
                        if (!Regex.IsMatch(strValue, strRegex))
                        {
                            VerControl(new VerificationEventArgs()
                            {
                                VerificationModel = vm,
                                Regex = strRegex,
                                ErrorMsg = strErrMsg,
                                IsVerifySuccess = false,
                                Required = m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c],
                                VerificationControl = c
                            });
                            bln = false;
                            return false;
                        }
                    }
                }
                //没有问题出发一个成功信息
                VerControl(new VerificationEventArgs()
                {
                    VerificationModel = vm,
                    Regex = strRegex,
                    ErrorMsg = strErrMsg,
                    IsVerifySuccess = true,
                    Required = m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c],
                    VerificationControl = c
                });
            }
            return bln;
        }
        #endregion
        #region 验证    English:Verification
        /// <summary>
        /// 功能描述:验证    English:Verification
        /// 作  者:HZH
        /// 创建日期:2019-09-27 17:54:38
        /// 任务编号:POS
        /// </summary>
        /// <returns>返回值</returns>
        public bool Verification()
        {
            bool bln = true;
            foreach (var item in m_controlCache)
            {
                Control c = item.Key;
                if (!Verification(c))
                {
                    bln = false;
                }
            }
            return bln;
        }
        #endregion



        #region 验证结果处理    English:Verification result processing
        /// <summary>
        /// 功能描述:验证结果处理    English:Verification result processing
        /// 作  者:HZH
        /// 创建日期:2019-09-27 17:54:59
        /// 任务编号:POS
        /// </summary>
        /// <param name="e">e</param>
        private void VerControl(VerificationEventArgs e)
        {
            //如果成功则移除失败提示
            if (e.IsVerifySuccess)
            {
                if (m_controlTips.ContainsKey(e.VerificationControl))
                {
                    m_controlTips[e.VerificationControl].Close();
                    m_controlTips.Remove(e.VerificationControl);
                }
            }
            //触发事件
            if (Verificationed != null)
            {
                Verificationed(e);
                if (e.IsProcessed)//如果已处理,则不再向下执行
                {
                    return;
                }
            }
            //如果失败则显示提示
            if (!e.IsVerifySuccess)
            {
                if (m_controlTips.ContainsKey(e.VerificationControl))
                {
                    m_controlTips[e.VerificationControl].StrMsg = e.ErrorMsg;
                }
                else
                {
                    var tips = Forms.FrmAnchorTips.ShowTips(e.VerificationControl, e.ErrorMsg, background: errorTipsBackColor, foreColor: errorTipsForeColor, autoCloseTime: 0, blnTopMost: false);
                    m_controlTips[e.VerificationControl] = tips;
                }
            }
        }
        #endregion
    }
}

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

作者:冰封一夏
出处: http://www.hzhcontrols.com/doc.html
HZHControls官网:http://www.hzhcontrols.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,
且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

原文出处:冰封一夏

原文链接:https://www.cnblogs.com/bfyx/p/11601586.html

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论