通過容器擴展屬性IExtenderProvider實現(xiàn)WinForm通用數(shù)據(jù)驗證組件
大家對如下的Tip組件使用應(yīng)該不陌生,要想讓窗體上的控件使用ToolTip功能,只需要拖動一個ToolTip組件到窗口,所有的控件就可以使用該功能,做信息提示。
本博文要記錄的,就是通過容器擴展屬性 IExtenderProvider,來實現(xiàn)一個數(shù)據(jù)驗證組件,通過將組件拖動到窗口后,使得上面的所有控件可以實現(xiàn)數(shù)據(jù)驗證!

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

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

1.實現(xiàn)思路:
通過記錄每個控件的驗證規(guī)則,和相應(yīng)驗證提示信息,結(jié)合ErrorProvider組件,為控件實現(xiàn)提示信息。時間不多,直接上代碼吧,看注釋。
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ù)驗證規(guī)則擴展屬性
/// </summary>
[Description("為菜單項或控件提供描述擴展屬性")]
[ProvideProperty("Verify", typeof(Control))]
[ProvideProperty("VerifyMsg", typeof(Control))]
public class ControlVerify : Component, IExtenderProvider
{
/// <summary>
/// 存儲所服務(wù)的控件及其驗證規(guī)則
/// </summary>
readonly Dictionary<Control, Validata> dic;
/// <summary>
/// 存儲所服務(wù)的控件及其驗證提示信息
/// </summary>
readonly Dictionary<Control, string> msgDic;
/// <summary>
/// 錯誤驗證提示類
/// </summary>
public ErrorProvider errTip;
/// <summary>
/// 創(chuàng)建一個Verify類
/// </summary>
public ControlVerify()
{
dic = new Dictionary<Control, Validata>();
msgDic = new Dictionary<Control, string>();
errTip = new ErrorProvider();
}
/// <summary>
/// 數(shù)據(jù)驗證
/// </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;//數(shù)據(jù)
var verify = item.Value;//驗證規(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 : "請輸入正確的數(shù)據(jù)");
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("設(shè)置驗證規(guī)則")] //雖然方法為Get,但在VS中顯示為“設(shè)置”才符合理解
[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>
/// 設(shè)置驗證規(guī)則描述
/// </summary>
public void SetVerify(Control item, Validata value)
{
if (item == null) { return; }
if (value == Validata.無)
{
//從集合中移除該item,并取消其相關(guān)事件綁定
dic.Remove(item);
msgDic.Remove(item);
}
else
{
//添加或更改該item的描述
dic[item] = value;//這種寫法對于dic中不存在的Key,會自動添加
msgDic[item] = "";
}
}
/// <summary>
/// 獲取菜單項描述
/// </summary>
[Description("設(shè)置驗證提示")] //雖然方法為Get,但在VS中顯示為“設(shè)置”才符合理解
[DefaultValue("")]
public string GetVerifyMsg(Control item)
{
//從集合中取出該item的描述
string value;
msgDic.TryGetValue(item, out value);
return value;
}
/// <summary>
/// 設(shè)置驗證規(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;//這種寫法對于dic中不存在的Key,會自動添加
}
}
/// <summary>
/// 是否可為某對象擴展屬性
/// </summary>
public bool CanExtend(object extendee)
{
return true;
}
}
public enum Validata
{
無,
Require,
AgeValue,
DateValue,
NumberValue,
TelValue,
IntValue,
IdCardValue,
}
}
2.調(diào)用方法:
Verify.VerifyData();

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中StringBuilder用法以及和String的區(qū)別分析
當我們在初學使用C#時,常常會不知道該用StringBuilder合適還是用String高效,下面是我在學習當中對StringBuilder和String的區(qū)別總結(jié),分享給大家。2013-03-03
Unity?AssetPostprocessor模型函數(shù)Model實用案例深入解析
這篇文章主要為大家介紹了Unity?AssetPostprocessor模型Model函數(shù)實用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05

