1. 程式人生 > >容器擴展屬性 IExtenderProvider 實現WinForm通用數據驗證組件

容器擴展屬性 IExtenderProvider 實現WinForm通用數據驗證組件

col 技術分享 true eval def ron 及其 結合 ram

大家對如下的Tip組件使用應該不陌生,要想讓窗體上的控件使用ToolTip功能,只需要拖動一個ToolTip組件到窗口,所有的控件就可以使用該功能,做信息提示。

本博文要記錄的,就是通過容器擴展屬性 IExtenderProvider,來實現一個數據驗證組件,通過將組件拖動到窗口後,使得上面的所有控件可以實現數據驗證!

技術分享

設置下面兩個擴展屬性,即可使用組件

技術分享

調用開放的驗證方法public bool VerifyData(Control ct = null)後,驗證樣式為:

技術分享

1.實現思路:

通過記錄每個控件的驗證規則,和相應驗證提示信息,結合ErrorProvider組件,為控件實現提示信息。時間不多,直接上代碼吧,看註釋。

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>
    /// 為控件提供數據驗證規則擴展屬性
    
/// </summary> [Description("為菜單項或控件提供描述擴展屬性")] [ProvideProperty("Verify", typeof(Control))] [ProvideProperty("VerifyMsg", typeof(Control))] public class ControlVerify : Component, IExtenderProvider { /// <summary> /// 存儲所服務的控件及其驗證規則 /// </summary> readonly
Dictionary<Control, Validata> dic; /// <summary> /// 存儲所服務的控件及其驗證提示信息 /// </summary> readonly Dictionary<Control, string> msgDic; /// <summary> /// 錯誤驗證提示類 /// </summary> public ErrorProvider errTip; /// <summary> /// 創建一個Verify類 /// </summary> public ControlVerify() { dic = new Dictionary<Control, Validata>(); msgDic = new Dictionary<Control, string>(); errTip = new ErrorProvider(); } /// <summary> /// 數據驗證 /// </summary> /// <returns></returns> /// <param name="ct">驗證控件所在容器 null為全部</param> public bool VerifyData(Control ct = null) { //errTip.Clear(); var ret = true; foreach (var item in dic) { var data = item.Key.Text;//數據 var verify = item.Value;//驗證規則 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 : "請輸入正確的數據"); ret = false; } } return ret; } /// <summary> /// 清除驗證提示 /// </summary> public void ClearVerify() { errTip.Clear(); } private bool DataVali(string data,Validata vali) { bool ret = false; var _data = data.Trim(); switch (vali) { case Validata.無: 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> /// 獲取菜單項描述 /// </summary> [Description("設置驗證規則")] //雖然方法為Get,但在VS中顯示為“設置”才符合理解 [DefaultValue(Validata.無)] public Validata GetVerify(Control item) { //從集合中取出該item的描述 Validata value; string str; dic.TryGetValue(item, out value); msgDic.TryGetValue(item, out str); return value; } /// <summary> /// 設置驗證規則描述 /// </summary> public void SetVerify(Control item, Validata value) { if (item == null) { return; } if (value == Validata.無) { //從集合中移除該item,並取消其相關事件綁定 dic.Remove(item); msgDic.Remove(item); } else { //添加或更改該item的描述 dic[item] = value;//這種寫法對於dic中不存在的Key,會自動添加 msgDic[item] = ""; } } /// <summary> /// 獲取菜單項描述 /// </summary> [Description("設置驗證提示")] //雖然方法為Get,但在VS中顯示為“設置”才符合理解 [DefaultValue("")] public string GetVerifyMsg(Control item) { //從集合中取出該item的描述 string value; msgDic.TryGetValue(item, out value); return value; } /// <summary> /// 設置驗證規則提示信息 /// </summary> public void SetVerifyMsg(Control item, string value) { if (item == null) { return; } if (value == "") { //從集合中移除該item,並取消其相關事件綁定 msgDic.Remove(item); } else { //添加或更改該item的描述 msgDic[item] = value;//這種寫法對於dic中不存在的Key,會自動添加 } } /// <summary> /// 是否可為某對象擴展屬性 /// </summary> public bool CanExtend(object extendee) { return true; } } public enum Validata { 無, Require, AgeValue, DateValue, NumberValue, TelValue, IntValue, IdCardValue, } }

2.調用方法:

Verify.VerifyData();

技術分享

容器擴展屬性 IExtenderProvider 實現WinForm通用數據驗證組件