入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
Install-Package HZH_Controls
https://www.cnblogs.com/bfyx/p/11364884.html
思路如下:
1、确定哪些控件需要进行验证,在组件中进行属性扩展
2、定义验证规则
3、根据验证规则的正则表达式进行验证和非空验证
4、触发验证结果事件
5、进行验证结果提示
添加一个验证规则枚举
1 /// <summary>
2 /// 验证规则
3 /// </summary>
4 public enum VerificationModel
5 {
6 /// <summary>
7 /// 无
8 /// </summary>
9 [Description("无"), VerificationAttribute()]
10 None = 1,
11 /// <summary>
12 /// 任意字母数字下划线
13 /// </summary>
14 [Description("任意字母数字下划线"), VerificationAttribute(@"^[a-zA-Z_0-1]*$", "请输入任意字母数字下划线")]
15 AnyChar = 2,
16 /// <summary>
17 /// 任意数字
18 /// </summary>
19 [Description("任意数字"), VerificationAttribute(@"^[\-\+]?\d+(\.\d+)?$", "请输入任意数字")]
20 Number = 4,
21 /// <summary>
22 /// 非负数
23 /// </summary>
24 [Description("非负数"), VerificationAttribute(@"^(\+)?\d+(\.\d+)?$", "请输入非负数")]
25 UnsignNumber = 8,
26 /// <summary>
27 /// 正数
28 /// </summary>
29 [Description("正数"), VerificationAttribute(@"(\+)?([1-9][0-9]*(\.\d{1,2})?)|(0\.\d{1,2})", "请输入正数")]
30 PositiveNumber = 16,
31 /// <summary>
32 /// 整数
33 /// </summary>
34 [Description("整数"), VerificationAttribute(@"^[\+\-]?\d+$", "请输入整数")]
35 Integer = 32,
36 /// <summary>
37 /// 非负整数
38 /// </summary>
39 [Description("非负整数"), VerificationAttribute(@"^(\+)?\d+$", "请输入非负整数")]
40 UnsignIntegerNumber = 64,
41 /// <summary>
42 /// 正整数
43 /// </summary>
44 [Description("正整数"), VerificationAttribute(@"^[0-9]*[1-9][0-9]*$", "请输入正整数")]
45 PositiveIntegerNumber = 128,
46 /// <summary>
47 /// 邮箱
48 /// </summary>
49 [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)$", "请输入正确的邮箱地址")]
50 Email = 256,
51 /// <summary>
52 /// 手机
53 /// </summary>
54 [Description("手机"), VerificationAttribute(@"^(\+?86)?1\d{10}$", "请输入正确的手机号")]
55 Phone = 512,
56 /// <summary>
57 /// IP
58 /// </summary>
59 [Description("IP"), VerificationAttribute(@"(?=(\b|\D))(((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))(?=(\b|\D))", "请输入正确的IP地址")]
60 IP = 1024,
61 /// <summary>
62 /// Url
63 /// </summary>
64 [Description("Url"), VerificationAttribute(@"^[a-zA-z]+://(//w+(-//w+)*)(//.(//w+(-//w+)*))*(//?//S*)?$", "请输入正确的网址")]
65 URL = 2048,
66 /// <summary>
67 /// 身份证号
68 /// </summary>
69 [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]$", "请输入正确的身份证号")]
70 IDCardNo = 4096,
71 /// <summary>
72 /// 正则验证
73 /// </summary>
74 [Description("自定义正则表达式"), VerificationAttribute()]
75 Custom = 8192,
76 }
还有一个验证规则枚举的特性
1 public class VerificationAttribute : Attribute
2 {
3 /// <summary>
4 /// Initializes a new instance of the <see cref="VerificationAttribute"/> class.
5 /// </summary>
6 /// <param name="strRegex">The string regex.</param>
7 /// <param name="strErrorMsg">The string error MSG.</param>
8 public VerificationAttribute(string strRegex = "", string strErrorMsg = "")
9 {
10 Regex = strRegex;
11 ErrorMsg = strErrorMsg;
12 }
13 /// <summary>
14 /// Gets or sets the regex.
15 /// </summary>
16 /// <value>The regex.</value>
17 public string Regex { get; set; }
18 /// <summary>
19 /// Gets or sets the error MSG.
20 /// </summary>
21 /// <value>The error MSG.</value>
22 public string ErrorMsg { get; set; }
23
24 }
定义事件参数
1 public class VerificationEventArgs : EventArgs
2 {
3 /// <summary>
4 /// Gets or sets the verification control.
5 /// </summary>
6 /// <value>The verification control.</value>
7 public Control VerificationControl { get; set; }
8 /// <summary>
9 /// Gets or sets a value indicating whether [verify success].
10 /// </summary>
11 /// <value><c>true</c> if [verify success]; otherwise, <c>false</c>.</value>
12 public bool IsVerifySuccess { get; set; }
13 /// <summary>
14 /// Gets or sets the verification model.
15 /// </summary>
16 /// <value>The verification model.</value>
17 public VerificationModel VerificationModel { get; set; }
18 /// <summary>
19 /// 是否已处理,如果为true,则不再使用默认验证提示功能
20 /// </summary>
21 /// <value><c>true</c> if this instance is processed; otherwise, <c>false</c>.</value>
22 public bool IsProcessed { get; set; }
23 /// <summary>
24 /// Gets or sets 正则表达式
25 /// </summary>
26 /// <value>The custom regex.</value>
27 public string Regex { get; set; }
28 /// <summary>
29 /// Gets or sets a value indicating whether this <see cref="VerificationEventArgs"/> is required.
30 /// </summary>
31 /// <value><c>true</c> if required; otherwise, <c>false</c>.</value>
32 public bool Required { get; set; }
33
34 /// <summary>
35 /// Gets or sets the error MSG.
36 /// </summary>
37 /// <value>The error MSG.</value>
38 public string ErrorMsg { get; set; }
39 }
添加一个类VerificationComponent继承Component,实现接口 IExtenderProvider以对控件进行扩展
定义属性
1 /// <summary>
2 /// Delegate VerificationedHandle
3 /// </summary>
4 /// <param name="e">The <see cref="VerificationEventArgs"/> instance containing the event data.</param>
5 public delegate void VerificationedHandle(VerificationEventArgs e);
6 /// <summary>
7 /// Occurs when [verificationed].
8 /// </summary>
9 [Browsable(true), Category("自定义属性"), Description("验证事件"), Localizable(true)]
10 public event VerificationedHandle Verificationed;
11
12 /// <summary>
13 /// The m control cache
14 /// </summary>
15 Dictionary<Control, VerificationModel> m_controlCache = new Dictionary<Control, VerificationModel>();
16 /// <summary>
17 /// The m control regex cache
18 /// </summary>
19 Dictionary<Control, string> m_controlRegexCache = new Dictionary<Control, string>();
20 /// <summary>
21 /// The m control required cache
22 /// </summary>
23 Dictionary<Control, bool> m_controlRequiredCache = new Dictionary<Control, bool>();
24 /// <summary>
25 /// The m control MSG cache
26 /// </summary>
27 Dictionary<Control, string> m_controlMsgCache = new Dictionary<Control, string>();
28 /// <summary>
29 /// The m control tips
30 /// </summary>
31 Dictionary<Control, Forms.FrmAnchorTips> m_controlTips = new Dictionary<Control, Forms.FrmAnchorTips>();
32
33 /// <summary>
34 /// The error tips back color
35 /// </summary>
36 private Color errorTipsBackColor = Color.FromArgb(255, 77, 58);
37
38 /// <summary>
39 /// Gets or sets the color of the error tips back.
40 /// </summary>
41 /// <value>The color of the error tips back.</value>
42 [Browsable(true), Category("自定义属性"), Description("错误提示背景色"), Localizable(true)]
43 public Color ErrorTipsBackColor
44 {
45 get { return errorTipsBackColor; }
46 set { errorTipsBackColor = value; }
47 }
48
49 /// <summary>
50 /// The error tips fore color
51 /// </summary>
52 private Color errorTipsForeColor = Color.White;
53
54 /// <summary>
55 /// Gets or sets the color of the error tips fore.
56 /// </summary>
57 /// <value>The color of the error tips fore.</value>
58 [Browsable(true), Category("自定义属性"), Description("错误提示文字颜色"), Localizable(true)]
59 public Color ErrorTipsForeColor
60 {
61 get { return errorTipsForeColor; }
62 set { errorTipsForeColor = value; }
63 }
哪些控件需要进行验证(属性扩展)
1 public bool CanExtend(object extendee)
2 {
3 if (extendee is TextBoxBase || extendee is UCTextBoxEx || extendee is ComboBox || extendee is UCCombox)
4 {
5 return true;
6 }
7 return false;
8 }
扩展属性
1 /// <summary>
2 /// The m control cache
3 /// </summary>
4 Dictionary<Control, VerificationModel> m_controlCache = new Dictionary<Control, VerificationModel>();
5 /// <summary>
6 /// The m control regex cache
7 /// </summary>
8 Dictionary<Control, string> m_controlRegexCache = new Dictionary<Control, string>();
9 /// <summary>
10 /// The m control required cache
11 /// </summary>
12 Dictionary<Control, bool> m_controlRequiredCache = new Dictionary<Control, bool>();
13 /// <summary>
14 /// The m control MSG cache
15 /// </summary>
16 Dictionary<Control, string> m_controlMsgCache = new Dictionary<Control, string>();
17
18 #region 验证规则 English:Validation rule
19 /// <summary>
20 /// Gets the verification model.
21 /// </summary>
22 /// <param name="control">The control.</param>
23 /// <returns>VerificationModel.</returns>
24 [Browsable(true), Category("自定义属性"), Description("验证规则"), DisplayName("VerificationModel"), Localizable(true)]
25 public VerificationModel GetVerificationModel(Control control)
26 {
27 if (m_controlCache.ContainsKey(control))
28 {
29 return m_controlCache[control];
30 }
31 else
32 return VerificationModel.None;
33 }
34
35 /// <summary>
36 /// Sets the verification model.
37 /// </summary>
38 /// <param name="control">The control.</param>
39 /// <param name="vm">The vm.</param>
40 public void SetVerificationModel(Control control, VerificationModel vm)
41 {
42 m_controlCache[control] = vm;
43 }
44 #endregion
45
46 #region 自定义正则 English:Custom Rules
47 /// <summary>
48 /// Gets the verification custom regex.
49 /// </summary>
50 /// <param name="control">The control.</param>
51 /// <returns>System.String.</returns>
52 [Browsable(true), Category("自定义属性"), Description("自定义验证正则表达式"), DisplayName("VerificationCustomRegex"), Localizable(true)]
53 public string GetVerificationCustomRegex(Control control)
54 {
55 if (m_controlRegexCache.ContainsKey(control))
56 {
57 return m_controlRegexCache[control];
58 }
59 else
60 return "";
61 }
62
63 /// <summary>
64 /// Sets the verification custom regex.
65 /// </summary>
66 /// <param name="control">The control.</param>
67 /// <param name="strRegex">The string regex.</param>
68 public void SetVerificationCustomRegex(Control control, string strRegex)
69 {
70 m_controlRegexCache[control] = strRegex;
71 }
72 #endregion
73
74 #region 必填 English:Must fill
75 /// <summary>
76 /// Gets the verification required.
77 /// </summary>
78 /// <param name="control">The control.</param>
79 /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
80 [Browsable(true), Category("自定义属性"), Description("是否必填项"), DisplayName("VerificationRequired"), Localizable(true)]
81 public bool GetVerificationRequired(Control control)
82 {
83 if (m_controlRequiredCache.ContainsKey(control))
84 return m_controlRequiredCache[control];
85 return false;
86 }
87
88 /// <summary>
89 /// Sets the verification required.
90 /// </summary>
91 /// <param name="control">The control.</param>
92 /// <param name="blnRequired">if set to <c>true</c> [BLN required].</param>
93 public void SetVerificationRequired(Control control, bool blnRequired)
94 {
95 m_controlRequiredCache[control] = blnRequired;
96 }
97 #endregion
98
99 #region 提示信息 English:Prompt information
100 /// <summary>
101 /// Gets the verification error MSG.
102 /// </summary>
103 /// <param name="control">The control.</param>
104 /// <returns>System.String.</returns>
105 [Browsable(true), Category("自定义属性"), Description("验证错误提示信息,当为空时则使用默认提示信息"), DisplayName("VerificationErrorMsg"), Localizable(true)]
106 public string GetVerificationErrorMsg(Control control)
107 {
108 if (m_controlMsgCache.ContainsKey(control))
109 return m_controlMsgCache[control];
110 return "";
111 }
112
113 /// <summary>
114 /// Sets the verification error MSG.
115 /// </summary>
116 /// <param name="control">The control.</param>
117 /// <param name="strErrorMsg">The string error MSG.</param>
118 public void SetVerificationErrorMsg(Control control, string strErrorMsg)
119 {
120 m_controlMsgCache[control] = strErrorMsg;
121 }
122 #endregion
验证处理
1 #region 验证 English:Verification
2 /// <summary>
3 /// 功能描述:验证 English:Verification result processing
4 /// 作 者:HZH
5 /// 创建日期:2019-09-28 09:02:49
6 /// 任务编号:POS
7 /// </summary>
8 /// <param name="c">c</param>
9 /// <returns>返回值</returns>
10 public bool Verification(Control c)
11 {
12 bool bln = true;
13 if (m_controlCache.ContainsKey(c))
14 {
15 var vm = m_controlCache[c];
16 string strRegex = "";
17 string strErrMsg = "";
18 #region 获取正则或默认错误提示 English:Get regular or error prompts
19 if (vm == VerificationModel.Custom)
20 {
21 //自定义正则
22 if (m_controlRegexCache.ContainsKey(c))
23 {
24 strRegex = m_controlRegexCache[c];
25 strErrMsg = "不正确的输入";
26 }
27 }
28 else
29 {
30 //获取默认正则和错误提示
31 Type type = vm.GetType(); //获取类型
32 MemberInfo[] memberInfos = type.GetMember(vm.ToString());
33 if (memberInfos.Length > 0)
34 {
35 var atts = memberInfos[0].GetCustomAttributes(typeof(VerificationAttribute), false);
36 if (atts.Length > 0)
37 {
38 var va = ((VerificationAttribute)atts[0]);
39 strErrMsg = va.ErrorMsg;
40 strRegex = va.Regex;
41 }
42 }
43 }
44 #endregion
45
46 #region 取值 English:Value
47 string strValue = "";
48 if (c is TextBoxBase)
49 {
50 strValue = (c as TextBoxBase).Text;
51 }
52 else if (c is UCTextBoxEx)
53 {
54 strValue = (c as UCTextBoxEx).InputText;
55 }
56 else if (c is ComboBox)
57 {
58 var cbo = (c as ComboBox);
59 if (cbo.DropDownStyle == ComboBoxStyle.DropDownList)
60 {
61 strValue = cbo.SelectedItem == null ? "" : cbo.SelectedValue.ToString();
62 }
63 else
64 {
65 strValue = cbo.Text;
66 }
67 }
68 else if (c is UCCombox)
69 {
70 strValue = (c as UCCombox).SelectedText;
71 }
72 #endregion
73
74 //自定义错误信息
75 if (m_controlMsgCache.ContainsKey(c) && !string.IsNullOrEmpty(m_controlMsgCache[c]))
76 strErrMsg = m_controlMsgCache[c];
77
78 //检查必填项
79 if (m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c])
80 {
81 if (string.IsNullOrEmpty(strValue))
82 {
83 VerControl(new VerificationEventArgs()
84 {
85 VerificationModel = vm,
86 Regex = strRegex,
87 ErrorMsg = "不能为空",
88 IsVerifySuccess = false,
89 Required = true,
90 VerificationControl = c
91 });
92 bln = false;
93 return false;
94 }
95 }
96 //验证正则
97 if (!string.IsNullOrEmpty(strValue))
98 {
99 if (!string.IsNullOrEmpty(strRegex))
100 {
101 if (!Regex.IsMatch(strValue, strRegex))
102 {
103 VerControl(new VerificationEventArgs()
104 {
105 VerificationModel = vm,
106 Regex = strRegex,
107 ErrorMsg = strErrMsg,
108 IsVerifySuccess = false,
109 Required = m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c],
110 VerificationControl = c
111 });
112 bln = false;
113 return false;
114 }
115 }
116 }
117 //没有问题出发一个成功信息
118 VerControl(new VerificationEventArgs()
119 {
120 VerificationModel = vm,
121 Regex = strRegex,
122 ErrorMsg = strErrMsg,
123 IsVerifySuccess = true,
124 Required = m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c],
125 VerificationControl = c
126 });
127 }
128 return bln;
129 }
130 #endregion
131 #region 验证 English:Verification
132 /// <summary>
133 /// 功能描述:验证 English:Verification
134 /// 作 者:HZH
135 /// 创建日期:2019-09-27 17:54:38
136 /// 任务编号:POS
137 /// </summary>
138 /// <returns>返回值</returns>
139 public bool Verification()
140 {
141 bool bln = true;
142 foreach (var item in m_controlCache)
143 {
144 Control c = item.Key;
145 if (!Verification(c))
146 {
147 bln = false;
148 }
149 }
150 return bln;
151 }
152 #endregion
153
154
155
156 #region 验证结果处理 English:Verification result processing
157 /// <summary>
158 /// 功能描述:验证结果处理 English:Verification result processing
159 /// 作 者:HZH
160 /// 创建日期:2019-09-27 17:54:59
161 /// 任务编号:POS
162 /// </summary>
163 /// <param name="e">e</param>
164 private void VerControl(VerificationEventArgs e)
165 {
166 //如果成功则移除失败提示
167 if (e.IsVerifySuccess)
168 {
169 if (m_controlTips.ContainsKey(e.VerificationControl))
170 {
171 m_controlTips[e.VerificationControl].Close();
172 m_controlTips.Remove(e.VerificationControl);
173 }
174 }
175 //触发事件
176 if (Verificationed != null)
177 {
178 Verificationed(e);
179 if (e.IsProcessed)//如果已处理,则不再向下执行
180 {
181 return;
182 }
183 }
184 //如果失败则显示提示
185 if (!e.IsVerifySuccess)
186 {
187 if (m_controlTips.ContainsKey(e.VerificationControl))
188 {
189 m_controlTips[e.VerificationControl].StrMsg = e.ErrorMsg;
190 }
191 else
192 {
193 var tips = Forms.FrmAnchorTips.ShowTips(e.VerificationControl, e.ErrorMsg, background: errorTipsBackColor, foreColor: errorTipsForeColor, autoCloseTime: 0, blnTopMost: false);
194 m_controlTips[e.VerificationControl] = tips;
195 }
196 }
197 }
198 #endregion
完整代码
1 // ***********************************************************************
2 // Assembly : HZH_Controls
3 // Created : 2019-09-27
4 //
5 // ***********************************************************************
6 // <copyright file="VerificationComponent.cs">
7 // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
8 // </copyright>
9 //
10 // Blog: https://www.cnblogs.com/bfyx
11 // GitHub:https://github.com/kwwwvagaa/NetWinformControl
12 // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
13 //
14 // If you use this code, please keep this note.
15 // ***********************************************************************
16 using System;
17 using System.Collections.Generic;
18 using System.ComponentModel;
19 using System.Drawing;
20 using System.Linq;
21 using System.Reflection;
22 using System.Text;
23 using System.Text.RegularExpressions;
24 using System.Windows.Forms;
25
26 namespace HZH_Controls.Controls
27 {
28 /// <summary>
29 /// Class VerificationComponent.
30 /// Implements the <see cref="System.ComponentModel.Component" />
31 /// Implements the <see cref="System.ComponentModel.IExtenderProvider" />
32 /// </summary>
33 /// <seealso cref="System.ComponentModel.Component" />
34 /// <seealso cref="System.ComponentModel.IExtenderProvider" />
35 [ProvideProperty("VerificationModel", typeof(Control))]
36 [ProvideProperty("VerificationCustomRegex", typeof(Control))]
37 [ProvideProperty("VerificationRequired", typeof(Control))]
38 [ProvideProperty("VerificationErrorMsg", typeof(Control))]
39 [DefaultEvent("Verificationed")]
40 public class VerificationComponent : Component, IExtenderProvider
41 {
42 /// <summary>
43 /// Delegate VerificationedHandle
44 /// </summary>
45 /// <param name="e">The <see cref="VerificationEventArgs"/> instance containing the event data.</param>
46 public delegate void VerificationedHandle(VerificationEventArgs e);
47 /// <summary>
48 /// Occurs when [verificationed].
49 /// </summary>
50 [Browsable(true), Category("自定义属性"), Description("验证事件"), Localizable(true)]
51 public event VerificationedHandle Verificationed;
52
53 /// <summary>
54 /// The m control cache
55 /// </summary>
56 Dictionary<Control, VerificationModel> m_controlCache = new Dictionary<Control, VerificationModel>();
57 /// <summary>
58 /// The m control regex cache
59 /// </summary>
60 Dictionary<Control, string> m_controlRegexCache = new Dictionary<Control, string>();
61 /// <summary>
62 /// The m control required cache
63 /// </summary>
64 Dictionary<Control, bool> m_controlRequiredCache = new Dictionary<Control, bool>();
65 /// <summary>
66 /// The m control MSG cache
67 /// </summary>
68 Dictionary<Control, string> m_controlMsgCache = new Dictionary<Control, string>();
69 /// <summary>
70 /// The m control tips
71 /// </summary>
72 Dictionary<Control, Forms.FrmAnchorTips> m_controlTips = new Dictionary<Control, Forms.FrmAnchorTips>();
73
74 /// <summary>
75 /// The error tips back color
76 /// </summary>
77 private Color errorTipsBackColor = Color.FromArgb(255, 77, 58);
78
79 /// <summary>
80 /// Gets or sets the color of the error tips back.
81 /// </summary>
82 /// <value>The color of the error tips back.</value>
83 [Browsable(true), Category("自定义属性"), Description("错误提示背景色"), Localizable(true)]
84 public Color ErrorTipsBackColor
85 {
86 get { return errorTipsBackColor; }
87 set { errorTipsBackColor = value; }
88 }
89
90 /// <summary>
91 /// The error tips fore color
92 /// </summary>
93 private Color errorTipsForeColor = Color.White;
94
95 /// <summary>
96 /// Gets or sets the color of the error tips fore.
97 /// </summary>
98 /// <value>The color of the error tips fore.</value>
99 [Browsable(true), Category("自定义属性"), Description("错误提示文字颜色"), Localizable(true)]
100 public Color ErrorTipsForeColor
101 {
102 get { return errorTipsForeColor; }
103 set { errorTipsForeColor = value; }
104 }
105
106 #region 构造函数 English:Constructor
107 /// <summary>
108 /// Initializes a new instance of the <see cref="VerificationComponent"/> class.
109 /// </summary>
110 public VerificationComponent()
111 {
112
113 }
114
115 /// <summary>
116 /// Initializes a new instance of the <see cref="VerificationComponent"/> class.
117 /// </summary>
118 /// <param name="container">The container.</param>
119 public VerificationComponent(IContainer container)
120 : this()
121 {
122 container.Add(this);
123 }
124 #endregion
125
126 #region 指定此对象是否可以将其扩展程序属性提供给指定的对象。 English:Specifies whether this object can provide its extender properties to the specified object.
127 /// <summary>
128 /// 指定此对象是否可以将其扩展程序属性提供给指定的对象。
129 /// </summary>
130 /// <param name="extendee">要接收扩展程序属性的 <see cref="T:System.Object" />。</param>
131 /// <returns>如果此对象可以扩展程序属性提供给指定对象,则为 true;否则为 false。</returns>
132 public bool CanExtend(object extendee)
133 {
134 if (extendee is TextBoxBase || extendee is UCTextBoxEx || extendee is ComboBox || extendee is UCCombox)
135 {
136 return true;
137 }
138 return false;
139 }
140 #endregion
141
142 #region 验证规则 English:Validation rule
143 /// <summary>
144 /// Gets the verification model.
145 /// </summary>
146 /// <param name="control">The control.</param>
147 /// <returns>VerificationModel.</returns>
148 [Browsable(true), Category("自定义属性"), Description("验证规则"), DisplayName("VerificationModel"), Localizable(true)]
149 public VerificationModel GetVerificationModel(Control control)
150 {
151 if (m_controlCache.ContainsKey(control))
152 {
153 return m_controlCache[control];
154 }
155 else
156 return VerificationModel.None;
157 }
158
159 /// <summary>
160 /// Sets the verification model.
161 /// </summary>
162 /// <param name="control">The control.</param>
163 /// <param name="vm">The vm.</param>
164 public void SetVerificationModel(Control control, VerificationModel vm)
165 {
166 m_controlCache[control] = vm;
167 }
168 #endregion
169
170 #region 自定义正则 English:Custom Rules
171 /// <summary>
172 /// Gets the verification custom regex.
173 /// </summary>
174 /// <param name="control">The control.</param>
175 /// <returns>System.String.</returns>
176 [Browsable(true), Category("自定义属性"), Description("自定义验证正则表达式"), DisplayName("VerificationCustomRegex"), Localizable(true)]
177 public string GetVerificationCustomRegex(Control control)
178 {
179 if (m_controlRegexCache.ContainsKey(control))
180 {
181 return m_controlRegexCache[control];
182 }
183 else
184 return "";
185 }
186
187 /// <summary>
188 /// Sets the verification custom regex.
189 /// </summary>
190 /// <param name="control">The control.</param>
191 /// <param name="strRegex">The string regex.</param>
192 public void SetVerificationCustomRegex(Control control, string strRegex)
193 {
194 m_controlRegexCache[control] = strRegex;
195 }
196 #endregion
197
198 #region 必填 English:Must fill
199 /// <summary>
200 /// Gets the verification required.
201 /// </summary>
202 /// <param name="control">The control.</param>
203 /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
204 [Browsable(true), Category("自定义属性"), Description("是否必填项"), DisplayName("VerificationRequired"), Localizable(true)]
205 public bool GetVerificationRequired(Control control)
206 {
207 if (m_controlRequiredCache.ContainsKey(control))
208 return m_controlRequiredCache[control];
209 return false;
210 }
211
212 /// <summary>
213 /// Sets the verification required.
214 /// </summary>
215 /// <param name="control">The control.</param>
216 /// <param name="blnRequired">if set to <c>true</c> [BLN required].</param>
217 public void SetVerificationRequired(Control control, bool blnRequired)
218 {
219 m_controlRequiredCache[control] = blnRequired;
220 }
221 #endregion
222
223 #region 提示信息 English:Prompt information
224 /// <summary>
225 /// Gets the verification error MSG.
226 /// </summary>
227 /// <param name="control">The control.</param>
228 /// <returns>System.String.</returns>
229 [Browsable(true), Category("自定义属性"), Description("验证错误提示信息,当为空时则使用默认提示信息"), DisplayName("VerificationErrorMsg"), Localizable(true)]
230 public string GetVerificationErrorMsg(Control control)
231 {
232 if (m_controlMsgCache.ContainsKey(control))
233 return m_controlMsgCache[control];
234 return "";
235 }
236
237 /// <summary>
238 /// Sets the verification error MSG.
239 /// </summary>
240 /// <param name="control">The control.</param>
241 /// <param name="strErrorMsg">The string error MSG.</param>
242 public void SetVerificationErrorMsg(Control control, string strErrorMsg)
243 {
244 m_controlMsgCache[control] = strErrorMsg;
245 }
246 #endregion
247
248
249 #region 验证 English:Verification
250 /// <summary>
251 /// 功能描述:验证 English:Verification result processing
252 /// 作 者:HZH
253 /// 创建日期:2019-09-28 09:02:49
254 /// 任务编号:POS
255 /// </summary>
256 /// <param name="c">c</param>
257 /// <returns>返回值</returns>
258 public bool Verification(Control c)
259 {
260 bool bln = true;
261 if (m_controlCache.ContainsKey(c))
262 {
263 var vm = m_controlCache[c];
264 string strRegex = "";
265 string strErrMsg = "";
266 #region 获取正则或默认错误提示 English:Get regular or error prompts
267 if (vm == VerificationModel.Custom)
268 {
269 //自定义正则
270 if (m_controlRegexCache.ContainsKey(c))
271 {
272 strRegex = m_controlRegexCache[c];
273 strErrMsg = "不正确的输入";
274 }
275 }
276 else
277 {
278 //获取默认正则和错误提示
279 Type type = vm.GetType(); //获取类型
280 MemberInfo[] memberInfos = type.GetMember(vm.ToString());
281 if (memberInfos.Length > 0)
282 {
283 var atts = memberInfos[0].GetCustomAttributes(typeof(VerificationAttribute), false);
284 if (atts.Length > 0)
285 {
286 var va = ((VerificationAttribute)atts[0]);
287 strErrMsg = va.ErrorMsg;
288 strRegex = va.Regex;
289 }
290 }
291 }
292 #endregion
293
294 #region 取值 English:Value
295 string strValue = "";
296 if (c is TextBoxBase)
297 {
298 strValue = (c as TextBoxBase).Text;
299 }
300 else if (c is UCTextBoxEx)
301 {
302 strValue = (c as UCTextBoxEx).InputText;
303 }
304 else if (c is ComboBox)
305 {
306 var cbo = (c as ComboBox);
307 if (cbo.DropDownStyle == ComboBoxStyle.DropDownList)
308 {
309 strValue = cbo.SelectedItem == null ? "" : cbo.SelectedValue.ToString();
310 }
311 else
312 {
313 strValue = cbo.Text;
314 }
315 }
316 else if (c is UCCombox)
317 {
318 strValue = (c as UCCombox).SelectedText;
319 }
320 #endregion
321
322 //自定义错误信息
323 if (m_controlMsgCache.ContainsKey(c) && !string.IsNullOrEmpty(m_controlMsgCache[c]))
324 strErrMsg = m_controlMsgCache[c];
325
326 //检查必填项
327 if (m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c])
328 {
329 if (string.IsNullOrEmpty(strValue))
330 {
331 VerControl(new VerificationEventArgs()
332 {
333 VerificationModel = vm,
334 Regex = strRegex,
335 ErrorMsg = "不能为空",
336 IsVerifySuccess = false,
337 Required = true,
338 VerificationControl = c
339 });
340 bln = false;
341 return false;
342 }
343 }
344 //验证正则
345 if (!string.IsNullOrEmpty(strValue))
346 {
347 if (!string.IsNullOrEmpty(strRegex))
348 {
349 if (!Regex.IsMatch(strValue, strRegex))
350 {
351 VerControl(new VerificationEventArgs()
352 {
353 VerificationModel = vm,
354 Regex = strRegex,
355 ErrorMsg = strErrMsg,
356 IsVerifySuccess = false,
357 Required = m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c],
358 VerificationControl = c
359 });
360 bln = false;
361 return false;
362 }
363 }
364 }
365 //没有问题出发一个成功信息
366 VerControl(new VerificationEventArgs()
367 {
368 VerificationModel = vm,
369 Regex = strRegex,
370 ErrorMsg = strErrMsg,
371 IsVerifySuccess = true,
372 Required = m_controlRequiredCache.ContainsKey(c) && m_controlRequiredCache[c],
373 VerificationControl = c
374 });
375 }
376 return bln;
377 }
378 #endregion
379 #region 验证 English:Verification
380 /// <summary>
381 /// 功能描述:验证 English:Verification
382 /// 作 者:HZH
383 /// 创建日期:2019-09-27 17:54:38
384 /// 任务编号:POS
385 /// </summary>
386 /// <returns>返回值</returns>
387 public bool Verification()
388 {
389 bool bln = true;
390 foreach (var item in m_controlCache)
391 {
392 Control c = item.Key;
393 if (!Verification(c))
394 {
395 bln = false;
396 }
397 }
398 return bln;
399 }
400 #endregion
401
402
403
404 #region 验证结果处理 English:Verification result processing
405 /// <summary>
406 /// 功能描述:验证结果处理 English:Verification result processing
407 /// 作 者:HZH
408 /// 创建日期:2019-09-27 17:54:59
409 /// 任务编号:POS
410 /// </summary>
411 /// <param name="e">e</param>
412 private void VerControl(VerificationEventArgs e)
413 {
414 //如果成功则移除失败提示
415 if (e.IsVerifySuccess)
416 {
417 if (m_controlTips.ContainsKey(e.VerificationControl))
418 {
419 m_controlTips[e.VerificationControl].Close();
420 m_controlTips.Remove(e.VerificationControl);
421 }
422 }
423 //触发事件
424 if (Verificationed != null)
425 {
426 Verificationed(e);
427 if (e.IsProcessed)//如果已处理,则不再向下执行
428 {
429 return;
430 }
431 }
432 //如果失败则显示提示
433 if (!e.IsVerifySuccess)
434 {
435 if (m_controlTips.ContainsKey(e.VerificationControl))
436 {
437 m_controlTips[e.VerificationControl].StrMsg = e.ErrorMsg;
438 }
439 else
440 {
441 var tips = Forms.FrmAnchorTips.ShowTips(e.VerificationControl, e.ErrorMsg, background: errorTipsBackColor, foreColor: errorTipsForeColor, autoCloseTime: 0, blnTopMost: false);
442 m_controlTips[e.VerificationControl] = tips;
443 }
444 }
445 }
446 #endregion
447 }
448 }
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧