欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過容器擴展屬性IExtenderProvider實現(xiàn)WinForm通用數(shù)據(jù)驗證組件

 更新時間:2021年12月21日 10:33:29   作者:VictorStar  
這篇文章介紹了通過容器擴展屬性IExtenderProvider實現(xiàn)WinForm通用數(shù)據(jù)驗證組件的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

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

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

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

1.實現(xiàn)思路:

通過記錄每個控件的驗證規(guī)則,和相應驗證提示信息,結(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>
        /// 存儲所服務的控件及其驗證規(guī)則
        /// </summary>
        readonly Dictionary<Control, Validata> dic;
        /// <summary>
        /// 存儲所服務的控件及其驗證提示信息
        /// </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#的async和await的具體用法

    說說C#的async和await的具體用法

    本篇文章主要介紹了說說C#的async和await的具體用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Unity中C#和Java的相互調(diào)用實例代碼

    Unity中C#和Java的相互調(diào)用實例代碼

    在unity中接入sdk或者定制一些功能時,需要調(diào)用系統(tǒng)接口。安卓手機實際操作中,也就是Unity與android相互調(diào)用。我們在Unity中使用c#,android中使用java。
    2018-02-02
  • C#基礎(chǔ)語法:方法參數(shù)詳解

    C#基礎(chǔ)語法:方法參數(shù)詳解

    這篇文章主要介紹了C#基礎(chǔ)語法:方法參數(shù)詳解,本文講解了值參數(shù)、引用參數(shù)、輸出參數(shù)、參數(shù)數(shù)組等參數(shù)類型,并分別給出代碼實例,需要的朋友可以參考下
    2015-06-06
  • C#中各種計時器用法小結(jié)

    C#中各種計時器用法小結(jié)

    這篇文章主要介紹了C#中各種計時器用法,結(jié)合實例形式總結(jié)分析了C#中各種常用時間相關(guān)類實現(xiàn)計時器功能的操作技巧,需要的朋友可以參考下
    2017-06-06
  • C#中的Dialog對話框

    C#中的Dialog對話框

    這篇文章介紹了C#中的Dialog對話框,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#中StringBuilder用法以及和String的區(qū)別分析

    C#中StringBuilder用法以及和String的區(qū)別分析

    當我們在初學使用C#時,常常會不知道該用StringBuilder合適還是用String高效,下面是我在學習當中對StringBuilder和String的區(qū)別總結(jié),分享給大家。
    2013-03-03
  • C#交錯數(shù)組淺析

    C#交錯數(shù)組淺析

    這里介紹C#交錯數(shù)組,數(shù)組是具有同一類型的一組值,數(shù)組是引用類型的,因此存在內(nèi)存堆中。數(shù)組中的元素值可以在定義數(shù)組時賦予,也可以在定義數(shù)組后對單個元素進行賦值
    2012-09-09
  • C# 將字節(jié)流轉(zhuǎn)換為圖片的實例方法

    C# 將字節(jié)流轉(zhuǎn)換為圖片的實例方法

    C# 將字節(jié)流轉(zhuǎn)換為圖片的實例方法,需要的朋友可以參考一下
    2013-03-03
  • Unity?AssetPostprocessor模型函數(shù)Model實用案例深入解析

    Unity?AssetPostprocessor模型函數(shù)Model實用案例深入解析

    這篇文章主要為大家介紹了Unity?AssetPostprocessor模型Model函數(shù)實用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • C# 表達式樹Expression Trees的知識梳理

    C# 表達式樹Expression Trees的知識梳理

    本篇文章主要介紹了表達式樹 Expression Trees的基礎(chǔ)知識:Lambda 表達式創(chuàng)建表達式樹;API 創(chuàng)建表達式樹;編譯表達式樹;執(zhí)行表達式樹;修改表達式樹等等,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01

最新評論