(七十六)c#Winform自定义控件-表单验证组件
2019-09-28 09:42
1721 查看
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492
// *********************************************************************** // 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 D aec ictionary<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> aec 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 erro 2a20 rTipsForeColor = 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 /// 3ff8 任务编号: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; } } } //没有问题出发一个成功信息 3dd0 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 } }View Code
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧
相关文章推荐
- JS表单验证组件浅讲
- 浅谈正则表达式验证身份证号码(C# winform)
- JS组件系列——Form表单验证神器: BootstrapValidator
- (七十二)c#Winform自定义控件-雷达图
- C#写的支持SMTP验证的发送邮件组件
- Ext 表单组件 手动触发验证失败
- Winform(C#.NET)自动更新组件的使用及部分功能实现(续)
- C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
- vue使用Element组件时v-for循环里的表单项验证方法
- JS组件系列——Form表单验证神器: BootstrapValidator(转)
- c# winform操作excel,选择最合适的组件来读取XLS
- 基于vue2.0前端组件库element中 el-form表单 自定义验证填坑
- Visio Studio 2010 C# WinForm对Report报表身份验证的设置 推荐
- Visio Studio 2010 C# WinForm对Report报表身份验证的设置
- c# winform未能找到引用的组件“Excel”的解决办法
- c# winform未能找到引用的组件“Excel”的解决办法
- C# Winform利用POST传值方式模拟表单提交数据(Winform与网页交互)
- (五十八)c#Winform自定义控件-管道阀门(工业)
- 在ASP.NET中如何用C#.NET实现基于表单的验证
- C# WinForm自定义控件响应键盘事件