通過(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)用開(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)證提示類(lèi)
/// </summary>
public ErrorProvider errTip;
/// <summary>
/// 創(chuàng)建一個(gè)Verify類(lèi)
/// </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;//這種寫(xiě)法對(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;//這種寫(xiě)法對(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)文章
說(shuō)說(shuō)C#的async和await的具體用法
本篇文章主要介紹了說(shuō)說(shuō)C#的async和await的具體用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Unity中C#和Java的相互調(diào)用實(shí)例代碼
在unity中接入sdk或者定制一些功能時(shí),需要調(diào)用系統(tǒng)接口。安卓手機(jī)實(shí)際操作中,也就是Unity與android相互調(diào)用。我們?cè)赨nity中使用c#,android中使用java。2018-02-02
C#中StringBuilder用法以及和String的區(qū)別分析
當(dāng)我們?cè)诔鯇W(xué)使用C#時(shí),常常會(huì)不知道該用StringBuilder合適還是用String高效,下面是我在學(xué)習(xí)當(dāng)中對(duì)StringBuilder和String的區(qū)別總結(jié),分享給大家。2013-03-03
C# 將字節(jié)流轉(zhuǎn)換為圖片的實(shí)例方法
C# 將字節(jié)流轉(zhuǎn)換為圖片的實(shí)例方法,需要的朋友可以參考一下2013-03-03
Unity?AssetPostprocessor模型函數(shù)Model實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity?AssetPostprocessor模型Model函數(shù)實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
C# 表達(dá)式樹(shù)Expression Trees的知識(shí)梳理
本篇文章主要介紹了表達(dá)式樹(shù) Expression Trees的基礎(chǔ)知識(shí):Lambda 表達(dá)式創(chuàng)建表達(dá)式樹(shù);API 創(chuàng)建表達(dá)式樹(shù);編譯表達(dá)式樹(shù);執(zhí)行表達(dá)式樹(shù);修改表達(dá)式樹(shù)等等,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01

