winform + INotifyPropertyChanged + IDataErrorInfo + ErrorProvider实现自动验证功能
一个简单的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实现自动验证功能相关推荐
- php 自动验证表单类,thinkPHP 表单自动验证功能
昨天晚上我们老大叫我弄表单自动验证功能,愁了半天借鉴了好多官网的知识,才出来,诶,总之分享一下我自己的成果吧! thinkphp 在Model基类为我们定义了自动验证的函数和正则表达式,我们只需要在对 ...
- Winform窗体应用程序的自动更新功能
本文将演示一种桌面程序自动更新方案,其步骤比较多,但原理非常简单,通用性尚可,对于小型应用来说,直接拿去就可以用了. 原理 服务器端的结构是这样的: 其工作原理如下: Update.asmx 仅提供一 ...
- php字段验证规则,详解ThinkPHP中自动验证及验证规则
本篇文章详细介绍了thinkphp中自动验证及验证规则的方法,希望对学习thinkphp的朋友有帮助! 详解ThinkPHP中自动验证及验证规则 ThinkPHP 内置了数据对象的自动验证功能来完成模 ...
- php自动验证,ThinkPHP 自动验证及验证规则详解
ThinkPHP 自动验证 ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证.自动验证是基于数据对象的,而大多情况下数据对象是基于 $_POST表单 (不是绝对的)创建的. 基本 ...
- php字段验证规则,ThinkPHP 自动验证及验证规则详解
ThinkPHP 自动验证及验证规则详解 ThinkPHP 自动验证 ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证.自动验证是基于数据对象的,而大多情况下数据对象是基于 $_ ...
- mysql版网络验证自动发卡功能
网络验证Mysql版自动发卡流程 百宝云网络验证系_MySQL版支持完整的代理功能,默认200并发数,支持的同时在线人数3000-20000人,使用企业级的mysql数据库作为存储数据库,稳定性能是之 ...
- java 自动登录功能_jsp实现用户自动登录功能
理解并掌握cookie的作用以及利用cookie实现用户的自动登录功能,实现下图效果 当服务器判断出该用户是首次登录的时候,会自动跳转到登录界面等待用户登录,并填入相关信息.通过设置cookie的有效 ...
- 业务系统实现记住密码和自动登录功能
业务系统实现记住密码和自动登录功能 公司的业务系统本来是受域控的,用户不需要登录可以直接访问系统.当然,虽然不用人工登录,系统本身会读取电脑的用户名为登录标识,对系统操作权限和记录也是以电脑名.近段时 ...
- 使用文档自动保存功能
使用文档自动保存功能 也许大家在工作中遇到过这样的问题,那就是在你编辑文档并没有保存的时候,比如说使用word或者wps.突然停电了!(我就遇到过这种情况,而且还造成了公司 ...
最新文章
- arm remapping控制输入_解析机器视觉中运动控制卡与PLC的区别
- 算法提高课-图论-负环-AcWing 1165. 单词环:spfa判正环、二分、01分数规划
- python中使用ElementTree 操作XML
- stm32f4xx 的EXTI使用的一般步骤
- java面试解决项目难题_Java转换难题者,不适合工作(或面试)
- java当前4中引用_Java的四种引用
- java url接口_javaweb 后台使用url接口
- MongoDB(三):创建、更新和删除文档
- php的数据结构有哪些,PHP数据结构有几种
- 如何删除win10的windows.old
- cad填充密度怎么调整_CAD填充图案放在哪里,这几步你要了解
- 计算机有关的科技论文题目,计算机前沿科技论文选题范文 计算机前沿科技专业论文题目如何拟...
- 邓俊辉 数据结构 图
- 斐讯n1刷鸿蒙系统,【总结】在N1上面成功刷入armbian并启动的步骤
- 队友代码拜读(文末附福利呦)
- k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1beta1.Ingress: failed to l
- 如何修改树莓派系统时间
- 见证国内人工智能与机器人技术的进步
- 服务器自带ddos工具,62款经典DDOS工具
- 湿法冶金以及铼提取工艺,湿法冶金工艺特点及工艺流程
热门文章
- C# processbar设置
- java中gettext方法_深入理解Java中方法的参数传递机制
- php 保护图片地址,如何使用PHP正确保护图片上传?
- java 正则替换cdata_XML中配置正则表达式的写法
- OpenCV基本线条操作
- 【matlab】直方图(hist函数的应用)
- mac开发java安卓_mac下Android开发环境搭建
- 从零开始刷Leetcode——数组(581.605.628)
- featuretools,可自动构造机器学习特征的Python库
- 最新(2019)斯坦福CS224n深度学习自然语言处理课程(视频+笔记+2017年合集)