容器扩展属性 IExtenderProvider 实现WinForm通用数据验证组件

大家对如下的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();

时间: 2024-11-08 19:00:41

容器扩展属性 IExtenderProvider 实现WinForm通用数据验证组件的相关文章

自定义react数据验证组件

我们在做前端表单提交时,经常会遇到要对表单中的数据进行校验的问题.如果用户提交的数据不合法,例如格式不正确.非数字类型.超过最大长度.是否必填项.最大值和最小值等等,我们需要在相应的地方给出提示信息.如果用户修正了数据,我们还要将提示信息隐藏起来. 有一些现成的插件可以让你非常方便地实现这一功能,如果你使用的是knockout框架,那么你可以借助于Knockout-Validation这一插件.使用起来很简单,例如我下面的这一段代码: ko.validation.locale('zh-CN');

ASP.NET通用权限验证组件实现

沙发(SF)通用权限验证组件 开篇 本篇介绍通用权限验证的实现代码思路,总共分为导入参数.解析XML.根据XML配置进行处理.返回结果. 代码架构图 1.   类介绍 1.SFWebPermission:实现IHttpModule接口,权限验证入口: 2.SFConfig:导入XML配置类: 3.SFPermission:解析XML配置进行权限验证: 4.SFAccessOper:数据库操作类: 5.SFPermissionSQL:XML节点实体类: 6.SFParameter:XML节点实体类

Java实战之01Struts2-03属性封装、类型转换、数据验证

九.封装请求正文到对象中 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. 原因:是由一个staticParams的拦截器完成注入的. 2.动态参数封装:开发时用到的 通过用户的表单封装请求正文参数. 2.1.动作类作为实体模型 实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录) 1 public class Demo1Action extends ActionSupport { 2 3 private St

在SpringMVC中使用数据验证组件——hibernate-validator

在做web开发的时候,经常需要对客户端发送过来的数据进行一个验证,以防数据不合法.而SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上annotation @NotNull @Max等注解进行验证.JSR303提供有很多annotation借口,而SpringMVC对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包: <dependency> <groupId>org.hibernate</g

在Spring中使用数据验证组件hibernate-validator

在做web开发的时候,经常需要对客户端发送过来的数据进行一个验证,以防数据不合法. 而SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上annotation @NotNull @Max等注解进行验证.JSR303提供有很多annotation借口,而SpringMVC对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包: 在SpringMVC中引入 <dependency> <groupId>org.

【C#】使用IExtenderProvider为控件添加扩展属性,像ToolTip那样

申明: - 本文适用于WinForm开发 - 文中的“控件”一词是广义上的说法,泛指包括ToolStripItem.MenuItem在内单个界面元素,并不特指继承自Control类的狭义控件 用过ToolTip这个组件的童鞋都知道这样一个现象:在VS中拖入一个ToolTip,然后点击窗体中的各种控件,在其属性窗格中就会多出一个叫ToolTip的属性出来,如图: 本文要说的就是如何像ToolTip这样,为控件“扩展”出一个属性来(之所以用引号,是因为并不是真的为控件增加了一个属性,而是在VS中看起

WinForm TextBox 扩展方法数据验证

本文转载:http://www.cnblogs.com/gis-crazy/archive/2013/03/17/2964132.html 查看公司项目代码时,存在这样一个问题:winform界面上有很多信息填写,提交后台服务器更新,但数据的合法验证及值的转换却不太敢恭维,一堆的if判断和转换,便想着是否能扩展个方法出来,琢磨出个思路,记录下来与大家共同探讨,有不对的地方还请大家指正. 设计思路: 1. 由于大部分从TextBox控件中获取数据值,可以扩展个泛型方法出来,直接根据转换后的数据类型

WinForm TextBox自定义扩展方法数据验证

本文转载:http://www.cnblogs.com/gis-crazy/archive/2013/03/17/2964132.html 查看公司项目代码时,存在这样一个问题:winform界面上有很多信息填写,提交后台服务器更新,但数据的合法验证及值的转换却不太敢恭维,一堆的if判断和转换,便想着是否能扩展个方法出来,琢磨出个思路,记录下来与大家共同探讨,有不对的地方还请大家指正. 设计思路: 1. 由于大部分从TextBox控件中获取数据值,可以扩展个泛型方法出来,直接根据转换后的数据类型

EF通用数据层封装类(支持读写分离,一主多从)

浅谈orm 记得四年前在学校第一次接触到 Ling to Sql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,ServiceStack.OrmLite 等.当然每种orm都有各自的优势,也有不足的地方.园子里也有很多大神开源了他们写的orm,如SqlSugar,Chloe.ORM,CYQ.Data 等.先不说这些开源的orm使用度怎么样,我觉得起码从开源的精神上就很可嘉了,我也曾下载过这几位大神的源码进行学习. 所有o