網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
通過(guò)容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件_C#教程
作者:VictorStar ? 更新時(shí)間: 2022-03-10 編程語(yǔ)言大家對(duì)如下的Tip組件使用應(yīng)該不陌生,要想讓窗體上的控件使用ToolTip功能,只需要拖動(dòng)一個(gè)ToolTip組件到窗口,所有的控件就可以使用該功能,做信息提示。
本博文要記錄的,就是通過(guò)容器擴(kuò)展屬性 IExtenderProvider,來(lái)實(shí)現(xiàn)一個(gè)數(shù)據(jù)驗(yàn)證組件,通過(guò)將組件拖動(dòng)到窗口后,使得上面的所有控件可以實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證!
設(shè)置下面兩個(gè)擴(kuò)展屬性,即可使用組件
調(diào)用開(kāi)放的驗(yàn)證方法public bool VerifyData(Control ct = null)后,驗(yàn)證樣式為:
1.實(shí)現(xiàn)思路:
通過(guò)記錄每個(gè)控件的驗(yàn)證規(guī)則,和相應(yīng)驗(yàn)證提示信息,結(jié)合ErrorProvider組件,為控件實(shí)現(xiàn)提示信息。時(shí)間不多,直接上代碼吧,看注釋。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CFW.WinFormBase.Controls { /// <summary> /// 為控件提供數(shù)據(jù)驗(yàn)證規(guī)則擴(kuò)展屬性 /// </summary> [Description("為菜單項(xiàng)或控件提供描述擴(kuò)展屬性")] [ProvideProperty("Verify", typeof(Control))] [ProvideProperty("VerifyMsg", typeof(Control))] public class ControlVerify : Component, IExtenderProvider { /// <summary> /// 存儲(chǔ)所服務(wù)的控件及其驗(yàn)證規(guī)則 /// </summary> readonly Dictionary<Control, Validata> dic; /// <summary> /// 存儲(chǔ)所服務(wù)的控件及其驗(yàn)證提示信息 /// </summary> readonly Dictionary<Control, string> msgDic; /// <summary> /// 錯(cuò)誤驗(yàn)證提示類 /// </summary> public ErrorProvider errTip; /// <summary> /// 創(chuàng)建一個(gè)Verify類 /// </summary> public ControlVerify() { dic = new Dictionary<Control, Validata>(); msgDic = new Dictionary<Control, string>(); errTip = new ErrorProvider(); } /// <summary> /// 數(shù)據(jù)驗(yàn)證 /// </summary> /// <returns></returns> /// <param name="ct">驗(yàn)證控件所在容器 null為全部</param> public bool VerifyData(Control ct = null) { //errTip.Clear(); var ret = true; foreach (var item in dic) { var data = item.Key.Text;//數(shù)據(jù) var verify = item.Value;//驗(yàn)證規(guī)則 if (ct != null && item.Key.Parent != ct) { errTip.SetError(item.Key, ""); continue; } if (DataVali(data,verify)) { errTip.SetError(item.Key, ""); } else { string errMsg = msgDic[item.Key]; errTip.SetError(item.Key, errMsg.Length > 0 ? errMsg : "請(qǐng)輸入正確的數(shù)據(jù)"); ret = false; } } return ret; } /// <summary> /// 清除驗(yàn)證提示 /// </summary> public void ClearVerify() { errTip.Clear(); } private bool DataVali(string data,Validata vali) { bool ret = false; var _data = data.Trim(); switch (vali) { case Validata.無(wú): ret = true; break; case Validata.Require: if (_data.Length > 0) ret = true; break; case Validata.AgeValue: if (!_data.IsNullOrEmpty() && !_data.IsMatch("^[0 - 9] + $")) { ret = false; } else { ret = true; } break; case Validata.DateValue: ret = _data.IsMatch(@"^(\d{2}|\d{4})((0[1-9])|(1[0-2]))((0[1-9])|((1|2)[0-9])|30|31)$"); break; case Validata.NumberValue: ret = _data.IsMatch(@"^[0 - 9] + $"); break; case Validata.TelValue: ret = _data.IsPhone(); break; case Validata.IntValue: int parse = 0; ret = int.TryParse(_data,out parse); break; case Validata.IdCardValue: ret = _data.IsIdCard(); break; default: break; } return ret; } /// <summary> /// 獲取菜單項(xiàng)描述 /// </summary> [Description("設(shè)置驗(yàn)證規(guī)則")] //雖然方法為Get,但在VS中顯示為“設(shè)置”才符合理解 [DefaultValue(Validata.無(wú))] public Validata GetVerify(Control item) { //從集合中取出該item的描述 Validata value; string str; dic.TryGetValue(item, out value); msgDic.TryGetValue(item, out str); return value; } /// <summary> /// 設(shè)置驗(yàn)證規(guī)則描述 /// </summary> public void SetVerify(Control item, Validata value) { if (item == null) { return; } if (value == Validata.無(wú)) { //從集合中移除該item,并取消其相關(guān)事件綁定 dic.Remove(item); msgDic.Remove(item); } else { //添加或更改該item的描述 dic[item] = value;//這種寫法對(duì)于dic中不存在的Key,會(huì)自動(dòng)添加 msgDic[item] = ""; } } /// <summary> /// 獲取菜單項(xiàng)描述 /// </summary> [Description("設(shè)置驗(yàn)證提示")] //雖然方法為Get,但在VS中顯示為“設(shè)置”才符合理解 [DefaultValue("")] public string GetVerifyMsg(Control item) { //從集合中取出該item的描述 string value; msgDic.TryGetValue(item, out value); return value; } /// <summary> /// 設(shè)置驗(yàn)證規(guī)則提示信息 /// </summary> public void SetVerifyMsg(Control item, string value) { if (item == null) { return; } if (value == "") { //從集合中移除該item,并取消其相關(guān)事件綁定 msgDic.Remove(item); } else { //添加或更改該item的描述 msgDic[item] = value;//這種寫法對(duì)于dic中不存在的Key,會(huì)自動(dòng)添加 } } /// <summary> /// 是否可為某對(duì)象擴(kuò)展屬性 /// </summary> public bool CanExtend(object extendee) { return true; } } public enum Validata { 無(wú), Require, AgeValue, DateValue, NumberValue, TelValue, IntValue, IdCardValue, } }
2.調(diào)用方法:
Verify.VerifyData();
原文鏈接:https://www.cnblogs.com/Start201505/p/6925293.html
相關(guān)推薦
- 2022-10-20 Android?PowerManagerService省電模式策略控制_Android
- 2022-04-04 小程序Arrow function should not return assignment
- 2022-05-19 ASP.NET?Core框架探索之Authentication的權(quán)限認(rèn)證過(guò)程解析_實(shí)用技巧
- 2022-10-28 UpdateLayeredWindow實(shí)現(xiàn)任意異形窗口使用詳解_C#教程
- 2021-11-05 VBA工程加密PJ方式(兩種)_VBA
- 2022-07-06 使用pandas兩列轉(zhuǎn)換成字典的健和值_python
- 2022-08-23 C++?primer超詳細(xì)講解順序容器_C 語(yǔ)言
- 2023-01-20 Python輸入整數(shù)進(jìn)行排序方式_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支