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;
else
age = ;
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 < )
{
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 == )
errors.Remove(propertyName);
}
} public string Error
{
get { return errors.Count > ? "有验证错误" : ""; }
} public string this[string propertyName]
{
get
{
if (errors.ContainsKey(propertyName))
return string.Join(Environment.NewLine, errors[propertyName]);
else
return 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 = };
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 > ? "有验证错误" : ""; }
} public string This(string propertyName)
{
if (errors.ContainsKey(propertyName))
return string.Join(Environment.NewLine, errors[propertyName]);
else
return 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 == )
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;
}
else
RemoveError(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 = -;
if (!int.TryParse(value, out num))
{
AddError(propertyName, NUMBER);
isNumber = false;
}
else
RemoveError(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;
}
else
RemoveError(propertyName, string.Format(LENGTH_CROSS, length));
return isCross;
}
#endregion
}
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);
}
}
winform + INotifyPropertyChanged + IDataErrorInfo + ErrorProvider实现自动验证功能的更多相关文章
- WinForm应用程序中实现自动更新功能
WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...
- thinkPHP 表单自动验证功能
昨天晚上我们老大叫我弄表单自动验证功能,愁了半天借鉴了好多官网的知识,才出来,诶,总之分享一下我自己的成果吧! thinkphp 在Model基类为我们定义了自动验证的函数和正则表达式,我们只需要在对 ...
- <转>thinkphp自动验证无效的问题
新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...
- ThinkPHP 自动验证实例
//array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),protected $_validate = array( ); ThinkPHP 自动验证定义的附加规则如下: r ...
- tinkphp中的自动验证
tinkphp是国内非常流行的一个开源框架,国内大小公司都在用的框架.对于初学的好多同学感觉不太好上手,其实并没没有大家想的那么复杂.自动验证功能是thinkphp提高的一种数据验证方法,分为动态和静 ...
- thinkphp自动验证无效的问题
新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...
- Winform(C#.NET)自动更新组件的使用及部分功能实现
声明:核心功能的实现是由园子里圣殿骑士大哥写的,本人是基于他核心代码,按照自己需求进行修改的. 而AutoUpdaterService.xml文件生成工具是基于评论#215楼 ptangbao的代 ...
- Winform(C#.NET)自动更新组件的使用及部分功能实现(一点改进功能)
接前两篇继续: Winform(C#.NET)自动更新组件的使用及部分功能实现 Winform(C#.NET)自动更新组件的使用及部分功能实现(续) 借鉴文章:http://www.cnblogs.c ...
- Winform(C#.NET)自动更新组件的使用及部分功能实现(续)
接昨天的文章Winform(C#.NET)自动更新组件的使用及部分功能实现 强制更新的实现部分: 将DownloadConfirm窗体修改成单纯的类 public class DownloadConf ...
随机推荐
- kafka1:Kafka集群部署步骤
参考: kafka 集群--3个broker 3个zookeeper创建实战 细细品味Kafka_Kafka简介及安装_V1.3http://www.docin.com/p-1291437890.ht ...
- phpQuery对数据信息的采集进一步学习
前提:需要下载:phpQuery/phpQuery.php 链接:http://www.cnblogs.com/wuheng1991/p/5145398.html 1.对于规则的部分 <?php ...
- java web 登录框
我们会骂 12306 的网站界面挫,效果差,速度慢,回头看看自己写的代码,是不是也一样的狗血!在前端,很多看似简单的东西,内藏无数玄机.本文将以一个小小的登录框为入口,谈一谈如何完善自己的程序. 在很 ...
- java网络编程4-ServerSocket
//端口号为0则系统随机分配端口,连接队列系统一般默认50,指过超过系统最大的就以系统为准 //如果客户端的连接超过连接队列,则会被主机拒绝 ServerSocket serverSocket=new ...
- 【Python】求素数-未经过任何优化
print 'Find prime number smaller then input number \n' print 'Please input a number:' import time nu ...
- Java逍遥游记读书笔记<二>
Abstract抽象类 1.抽象类不能被实例化 2.抽象方法没有方法体 如: public abstract class Weapen { public abstract void attack(); ...
- 74、shape 画圆 加 边框
<?xml version="1.0" encoding="utf-8"?> <!--<shape xmlns:android=&quo ...
- Android UI开发第三十六篇——使用Volley加载图片列表
Android开发者可能会使用Universal Image Loader或者Square`s newer Picasso这些第三方的库去处理图片的加载,那么Volley是怎么加载图片列表的呢,这一篇 ...
- 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象
原创文章,欢迎转载.转载请注明:关东升的博客 内存托管对象 Swift中调用Core Foundation函数获得对象时候,对象分为:内存托管对象和内存非托管对象. 内存托管对象就是由编译器帮助管理内 ...
- 160623、理解 Promise 的工作原理
Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...