一个简单的Demo.百度下载链接:http://pan.baidu.com/s/1sj4oM2h

话不多说,上代码。

1.实体类定义:

class Student : INotifyPropertyChanged, IDataErrorInfo{// 用于保存验证错误信息。key 保存所验证的字段名称;value 保存对应的字段的验证错误信息列表private Dictionary<String, List<String>> errors = new Dictionary<string, List<string>>();private const string NAME_ERROR = "name 不能包含空格";private const string ID_ERROR = "id 不能小于 10";private int age;public int Age{get { return age; }set{if (IsIdValid(value))age = value;elseage = 0;OnPropertyChanged("Age");}}private string stuName;public string StuName{get { return stuName; }set{IsNameValid(value);stuName = value;OnPropertyChanged("StuName");}}public bool IsIdValid(int value){bool isValid = true;if (value < 10){AddError("Age", ID_ERROR);isValid = false;}else{RemoveError("Age", ID_ERROR);}return isValid;}public bool IsNameValid(string value){bool isValid = true;if (String.IsNullOrEmpty(value)){AddError("StuName", NAME_ERROR);isValid = false;}else{RemoveError("StuName", NAME_ERROR);}return isValid;}public void AddError(string propertyName, string error){if (!errors.ContainsKey(propertyName))errors[propertyName] = new List<string>();if (!errors[propertyName].Contains(error))errors[propertyName].Add(error);}public void RemoveError(string propertyName, string error){if (errors.ContainsKey(propertyName) && errors[propertyName].Contains(error)){errors[propertyName].Remove(error);if (errors[propertyName].Count == 0)errors.Remove(propertyName);}}public string Error{get { return errors.Count > 0 ? "有验证错误" : ""; }}public string this[string propertyName]{get{if (errors.ContainsKey(propertyName))return string.Join(Environment.NewLine, errors[propertyName]);elsereturn null;}}public void OnPropertyChanged(string propertyName){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}}public event PropertyChangedEventHandler PropertyChanged;}

Student.cs

2.界面Load绑定:

  拖个errorProvider控件,注意绑定方式。

DataSourceUpdateMode.OnPropertyChanged 可以在属性值改变时进行验证提示。
 public partial class Form1 : Form{Student stu = new Student() { StuName = "", Age = 0 };public Form1(){InitializeComponent();this.textBox1.DataBindings.Add(new Binding("Text", stu, "StuName", false, DataSourceUpdateMode.OnValidation));this.textBox2.DataBindings.Add(new Binding("Text", stu, "Age", false, DataSourceUpdateMode.OnValidation));this.errorProvider1.DataSource = stu;}}

3.判断是否包含错误

直接判断Student对象的Error属性是否为空即可

4.多个实体需要判断,可以抽出个类,根据自己需要扩展对应方法

public class DataErrorInfoCommon{// 用于保存验证错误信息。key 保存所验证的字段名称;value 保存对应的字段的验证错误信息列表public Dictionary<String, List<String>> errors = new Dictionary<string, List<string>>();public string Error{get { return errors.Count > 0 ? "有验证错误" : ""; }}public string This(string propertyName){if (errors.ContainsKey(propertyName))return string.Join(Environment.NewLine, errors[propertyName]);elsereturn null;}#region IDataErrorInfo验证方法private const string REQUIRED = "不能为空";private const string NUMBER = "请输入数字";private const string LENGTH_CROSS = "长度超过限制{0}";/// <summary>/// 添加错误消息/// </summary>/// <param name="propertyName">属性名称</param>/// <param name="error">错误消息</param>public void AddError(string propertyName, string error){if (!errors.ContainsKey(propertyName))errors[propertyName] = new List<string>();if (!errors[propertyName].Contains(error))errors[propertyName].Add(error);}/// <summary>/// 移除错误消息/// </summary>/// <param name="propertyName">属性名称</param>/// <param name="error">错误消息</param>public void RemoveError(string propertyName, string error){if (errors.ContainsKey(propertyName) && errors[propertyName].Contains(error)){errors[propertyName].Remove(error);if (errors[propertyName].Count == 0)errors.Remove(propertyName);}}/// <summary>/// 判断是否为空/// </summary>/// <param name="propertyName">属性名称</param>/// <param name="value">属性值</param>/// <returns></returns>public bool IsEmpty(string propertyName, string value){bool isEmpty = false;if (String.IsNullOrWhiteSpace(value)){AddError(propertyName, REQUIRED);isEmpty = true;}elseRemoveError(propertyName, REQUIRED);return isEmpty;}/// <summary>/// 判断内容是否是数字/// </summary>/// <param name="propertyName">属性名称</param>/// <param name="value">属性值</param>/// <returns></returns>public bool IsNumber(string propertyName, string value){bool isNumber = true;int num = -1;if (!int.TryParse(value, out num)){AddError(propertyName, NUMBER);isNumber = false;}elseRemoveError(propertyName, NUMBER);return isNumber;}/// <summary>/// 判断长度是否超过限制/// </summary>/// <param name="propertyName">属性名称</param>/// <param name="value">属性值</param>/// <param name="length">长度限制</param>/// <returns></returns>public bool IsCrossLenght(string propertyName, string value, int length){bool isCross = false;if (value.Length > length){AddError(propertyName, string.Format(LENGTH_CROSS, length));isCross = true;}elseRemoveError(propertyName, string.Format(LENGTH_CROSS, length));return isCross;}#endregion}

View Code

5.使用验证类

 //定义验证类对象public DataErrorInfoCommon dataErrorCommon = null;//在构造函数中初始化
dataErrorCommon =new DataErrorInfoCommon();//使用private string stuName;public string StuName{get { dataErrorCommon.IsEmpty("StuName", stuName);return stuName; }set{dataErrorCommon.IsEmpty("StuName",value);stuName = value;OnPropertyChanged("StuName");}}        public event PropertyChangedEventHandler PropertyChanged;/// 属性改变通知事件/// </summary>/// <param name="propertyName">属性通知</param>public void OnPropertyChanged(string propertyName){if (PropertyChanged != null){PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));}}public string Error{get { return dataErrorCommon.Error; }}public string this[string propertyName]{get{return dataErrorCommon.This(propertyName);}}

View Code

转载于:https://www.cnblogs.com/xcong/p/3617688.html

winform + INotifyPropertyChanged + IDataErrorInfo + ErrorProvider实现自动验证功能相关推荐

  1. php 自动验证表单类,thinkPHP 表单自动验证功能

    昨天晚上我们老大叫我弄表单自动验证功能,愁了半天借鉴了好多官网的知识,才出来,诶,总之分享一下我自己的成果吧! thinkphp 在Model基类为我们定义了自动验证的函数和正则表达式,我们只需要在对 ...

  2. Winform窗体应用程序的自动更新功能

    本文将演示一种桌面程序自动更新方案,其步骤比较多,但原理非常简单,通用性尚可,对于小型应用来说,直接拿去就可以用了. 原理 服务器端的结构是这样的: 其工作原理如下: Update.asmx 仅提供一 ...

  3. php字段验证规则,详解ThinkPHP中自动验证及验证规则

    本篇文章详细介绍了thinkphp中自动验证及验证规则的方法,希望对学习thinkphp的朋友有帮助! 详解ThinkPHP中自动验证及验证规则 ThinkPHP 内置了数据对象的自动验证功能来完成模 ...

  4. php自动验证,ThinkPHP 自动验证及验证规则详解

    ThinkPHP 自动验证 ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证.自动验证是基于数据对象的,而大多情况下数据对象是基于 $_POST表单 (不是绝对的)创建的. 基本 ...

  5. php字段验证规则,ThinkPHP 自动验证及验证规则详解

    ThinkPHP 自动验证及验证规则详解 ThinkPHP 自动验证 ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证.自动验证是基于数据对象的,而大多情况下数据对象是基于 $_ ...

  6. mysql版网络验证自动发卡功能

    网络验证Mysql版自动发卡流程 百宝云网络验证系_MySQL版支持完整的代理功能,默认200并发数,支持的同时在线人数3000-20000人,使用企业级的mysql数据库作为存储数据库,稳定性能是之 ...

  7. java 自动登录功能_jsp实现用户自动登录功能

    理解并掌握cookie的作用以及利用cookie实现用户的自动登录功能,实现下图效果 当服务器判断出该用户是首次登录的时候,会自动跳转到登录界面等待用户登录,并填入相关信息.通过设置cookie的有效 ...

  8. 业务系统实现记住密码和自动登录功能

    业务系统实现记住密码和自动登录功能 公司的业务系统本来是受域控的,用户不需要登录可以直接访问系统.当然,虽然不用人工登录,系统本身会读取电脑的用户名为登录标识,对系统操作权限和记录也是以电脑名.近段时 ...

  9. 使用文档自动保存功能

                 使用文档自动保存功能  也许大家在工作中遇到过这样的问题,那就是在你编辑文档并没有保存的时候,比如说使用word或者wps.突然停电了!(我就遇到过这种情况,而且还造成了公司 ...

最新文章

  1. arm remapping控制输入_解析机器视觉中运动控制卡与PLC的区别
  2. 算法提高课-图论-负环-AcWing 1165. 单词环:spfa判正环、二分、01分数规划
  3. python中使用ElementTree 操作XML
  4. stm32f4xx 的EXTI使用的一般步骤
  5. java面试解决项目难题_Java转换难题者,不适合工作(或面试)
  6. java当前4中引用_Java的四种引用
  7. java url接口_javaweb 后台使用url接口
  8. MongoDB(三):创建、更新和删除文档
  9. php的数据结构有哪些,PHP数据结构有几种
  10. 如何删除win10的windows.old
  11. cad填充密度怎么调整_CAD填充图案放在哪里,这几步你要了解
  12. 计算机有关的科技论文题目,计算机前沿科技论文选题范文 计算机前沿科技专业论文题目如何拟...
  13. 邓俊辉 数据结构 图
  14. 斐讯n1刷鸿蒙系统,【总结】在N1上面成功刷入armbian并启动的步骤
  15. 队友代码拜读(文末附福利呦)
  16. k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1beta1.Ingress: failed to l
  17. 如何修改树莓派系统时间
  18. 见证国内人工智能与机器人技术的进步
  19. 服务器自带ddos工具,62款经典DDOS工具
  20. 湿法冶金以及铼提取工艺,湿法冶金工艺特点及工艺流程

热门文章

  1. C# processbar设置
  2. java中gettext方法_深入理解Java中方法的参数传递机制
  3. php 保护图片地址,如何使用PHP正确保护图片上传?
  4. java 正则替换cdata_XML中配置正则表达式的写法
  5. OpenCV基本线条操作
  6. 【matlab】直方图(hist函数的应用)
  7. mac开发java安卓_mac下Android开发环境搭建
  8. 从零开始刷Leetcode——数组(581.605.628)
  9. featuretools,可自动构造机器学习特征的Python库
  10. 最新(2019)斯坦福CS224n深度学习自然语言处理课程(视频+笔记+2017年合集)