通过容器扩展属性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();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 关于C#.net winform程序验证moss的集成身份认证实例

    最近开发vsto程序需要上传文档到moss平台,因为网站使用的是windows集成认证,所以遇到了权限问题,需要输入密码.使操作和用户体验非常不方便,研究了好久没有找到好的方法,最后终于让我踏破铁鞋总结出了下面的方法,原理我个人的理解应该是模拟IE发送验证的消息进行验证,可以通过实现登录的问题. 注:需要添加名称为Microsoft XML,V2.6以上版本的COM引用 复制代码 代码如下: private void button3_Click(object sender, EventArgs

  • C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)

    一.功能界面 图1 验证码(区分大小写) 图2 验证码(不区分大小写) 二.创建一个产生验证码的类Class1 (1)生成随机验证码字符串,用的是Random随机函数 (2)创建验证码图片,将该字符串画在PictureBox控件中 Class1.cs: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using S

  • C# winform登陆框验证码的实现方法

    本文实例为大家分享了C# winform登陆框验证码的具体代码,供大家参考,具体内容如下 1.  新建一个简单的 windows 应用项目 在默认的 Form1 中添加如下控件: 1)  Label : text = " 输入验证码 :" 2)  TextBox : name=" txtValidCode" 输入验证码的文本框 3)  Image : name=" picValidCode" 显示验证码的图片控件 4)  Button :单击事件

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

    大家对如下的Tip组件使用应该不陌生,要想让窗体上的控件使用ToolTip功能,只需要拖动一个ToolTip组件到窗口,所有的控件就可以使用该功能,做信息提示. 本博文要记录的,就是通过容器扩展属性 IExtenderProvider,来实现一个数据验证组件,通过将组件拖动到窗口后,使得上面的所有控件可以实现数据验证! 设置下面两个扩展属性,即可使用组件 调用开放的验证方法public bool VerifyData(Control ct = null)后,验证样式为: 1.实现思路: 通过记录

  • Spring生命周期回调与容器扩展详解

    本篇主要总结下Spring容器在初始化实例前后,提供的一些回调方法和可扩展点.利用这些方法和扩展点,可以实现在Spring初始化实例前后做一些特殊逻辑处理. 下面主要介绍: 类级别的生命周期初始化回调方法init-method配置.InitializingBean接口和PostConstruct注解 容器级别的扩展BeanPostProcessor接口和BeanFactoryPostProcessor接口 1.类级别生命周期回调 1.1init-method 参照:Springbeanxsdin

  • SqlServer 扩展属性的介绍

    SqlServer帮助中对扩展属性的描述是: The Extended Properties property sets or retrieves provider-specific connection information that cannot be explicitly described through the property mechanism. 对于扩展属性有如下操作: 复制代码 代码如下: exec sp_addextendedproperty N'MS_Descriptio

  • Kotlin 扩展函数和扩展属性的使用方法

    Kotlin 能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式. 这通过叫做 扩展 的特殊声明完成. 例如,你可以为一个你不能修改的.来自第三方库中的类编写一个新的函数. 这个新增的函数就像那个原始类本来就有的函数一样,可以用普通的方法调用. 这种机制称为 扩展函数 .此外,也有 扩展属性 , 允许你为一个已经存在的类添加新的属性. 前言 作为安卓开发,我们常常碰到这样的场景,需要把以dp为单位的值转化为以px为单位.这时候我们常会写一个Utils类,比如说 public cl

  • 在PHP中操作文件的扩展属性

    在操作系统的文件中,还存在着一种我们可以自己定义的文件属性.这些属性不是保存在文件内容中,也不是直接可以通过 ls -al 所能看到的内容.它们可以将一个键值对信息永久得关联到文件上,一般现在的 Linux 系统都支持这样的文件扩展属性的功能.在操作系统中我们可以通过 setfattr. getfattr. attr 这些命令来操作它们.当然,PHP 也为我们提供了一个扩展可以用于对文件的扩展属性进行操作. 添加扩展属性 $file = __FILE__; var_dump(xattr_set(

  • asp的通用数据分页类

    (原创)<!--#include file="Conn.asp" --> 通用数据分页类     通用分页类,以后写分页显示数据时就轻松多啦.直接调用此类,然后再Execute即可以取得当前页的所有数据.     此类所做的工作是只取得当前页的数据,和总页数和总记录数等等数据. ASP代码: <% '/*****************************分页显示类************************** '/* 作者:哇哇鱼 '/* 日期:2004年

  • 汇编语言80x86系统通用数据传送指令详解

    目录 通用数据传送指令 附上UML Markdown代码: 通用数据传送指令 MOV move 传送 MOVSX move with sign-extend 带符号扩展传送 MOVZX move with zero-extend 带零扩展传送 PUSH push onto the stack 进栈 POP pop from the stack 出栈 PUSHA/PUSHAD push all registers 所有寄存器进栈 POPA/POPAD pop all registers 所有寄存器

  • ASP.NET通用权限验证的实现代码思路

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

  • Vue2.x通用条件搜索组件的封装及应用详解

    本文实例为大家分享了Vue2.x通用条件搜索组件的封装及应用,供大家参考,具体内容如下 效果   组件源码 <template> <div class="search"> <el-select v-model="type" @change="changeType" class="select"> <el-option v-for="item in selectItems&qu

  • JS数组属性去重并校验重复数据

    这篇文章主要介绍了JS数组属性去重并校验重复数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 新任务: 下拉框出去重复数据 //前端对象数组 按某个属性去重 其中jsonArray 是你要去重的对象数组 示例中 按name属性去重 //前端对象数组 按某个属性去重 var obj = {}; jsonArray = jsonArray.reduce(function(item,next){ obj[next.name]?'':obj[next

随机推荐