通過(guò)容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件
大家對(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)用開放的驗(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();

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)判斷一個(gè)時(shí)間點(diǎn)是否位于給定時(shí)間區(qū)間的方法
這篇文章主要介紹了C#實(shí)現(xiàn)判斷一個(gè)時(shí)間點(diǎn)是否位于給定時(shí)間區(qū)間的方法,涉及C#針對(duì)時(shí)間的轉(zhuǎn)換與判定相關(guān)技巧,需要的朋友可以參考下2015-08-08
C# 實(shí)現(xiàn)Trim方法去除字符串前后的所有空格
這篇文章主要介紹了C# 實(shí)現(xiàn)Trim方法去除字符串前后的所有空格,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
C# web應(yīng)用程序不能訪問(wèn)app_code下類的原因以及解決方法
本文主要介紹了C#web應(yīng)用程序不能訪問(wèn)app_code下類的原因以及解決方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
C#實(shí)現(xiàn)自動(dòng)填充文字內(nèi)容到指定圖片
這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)自動(dòng)填充文字內(nèi)容到指定圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
詳解C#對(duì)路徑...的訪問(wèn)被拒絕解決過(guò)程
這篇文章主要介紹了詳解C#對(duì)路徑...的訪問(wèn)被拒絕解決過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
C#?多項(xiàng)目打包時(shí)如何將項(xiàng)目引用轉(zhuǎn)為包依賴(最新推薦)
這篇文章主要介紹了C#多項(xiàng)目打包時(shí)如何將項(xiàng)目引用轉(zhuǎn)為包依賴,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04

