123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515 |
- // ***********************************************************************
- // 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; }
- }
- private int autoCloseErrorTipsTime = 3000;
- [Browsable(true), Category("自定义属性"), Description("自动关闭提示事件,当值为0时不自动关闭"), Localizable(true)]
- public int AutoCloseErrorTipsTime
- {
- get { return autoCloseErrorTipsTime; }
- set
- {
- if (value < 0)
- return;
- autoCloseErrorTipsTime = 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: autoCloseErrorTipsTime, blnTopMost: false);
- tips.FormClosing += tips_FormClosing;
- m_controlTips[e.VerificationControl] = tips;
- }
- }
- }
- void tips_FormClosing(object sender, FormClosingEventArgs e)
- {
- foreach (var item in m_controlTips)
- {
- if (item.Value == sender)
- {
- m_controlTips.Remove(item.Key);
- break;
- }
- }
- }
- #endregion
- /// <summary>
- /// 关闭所有错误提示
- /// </summary>
- public void CloseErrorTips()
- {
- for (int i = 0; i < 1; )
- {
- try
- {
- foreach (var item in m_controlTips)
- {
- if (item.Value != null && !item.Value.IsDisposed)
- {
- item.Value.Close();
- }
- }
- }
- catch
- {
- continue;
- }
- i++;
- }
- m_controlTips.Clear();
- }
- /// <summary>
- /// 关闭指定验证控件的提示
- /// </summary>
- /// <param name="verificationControl">验证控件.</param>
- public void CloseErrorTips(Control verificationControl)
- {
- if (m_controlTips.ContainsKey(verificationControl))
- {
- if (m_controlTips[verificationControl] != null && !m_controlTips[verificationControl].IsDisposed)
- {
- m_controlTips[verificationControl].Close();
- }
- }
- }
- }
- }
|