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 ...
随机推荐
- (转)java 静态内部类
转自:http://blog.sina.com.cn/s/blog_605f5b4f0100zbps.html 参考:http://docs.oracle.com/javase/tutorial/ja ...
- 根本上解决npm install 报错“ajv-keywords@3.4.0 requires a peer of ajv@^6.9.1 but none is installed. You must install peer dependencies yourself.“
每次项目npm install 的时候都报这个错误, 然后网上找的方法就把这个 ajv重新安装下,感觉有点麻烦, 后来有次我把npm更新了一下(我的版本是: 6.1.0),更新到了最新版本,这个问题就 ...
- [Algorithms] KMP
KMP is a classic and yet notoriously hard-to-understand algorithm. However, I think the following tw ...
- pc端和移动端的区别
以下都是自己的个人理解,说错了希望大家多交流交流.1,普通pc端开发与移动端开发区别.普通pc端开发,我理解就是你拿电脑打开的网页都算[这相信大部分人都知道].那么移动端开发工程师,说白了就很好理解了 ...
- ESX 5.0 上运行虚拟ESX
如何在ESX上安裝ESX需注意幾點: 1.Guest OS選Linux / Red Hat Enterprise Linux 5 (64-bit) 2.使用SSH連線實體ESX主機下指令 添加*.vm ...
- Extjs combobox 实现搜索框的效果
目的:使用combobox实现一个类似搜索框的效果,即用户输入内容后,出现相关下列列表,提供选择. 实现:extjs3 中combobox自身带这个功能即在remote模式下,store在load的时 ...
- Babel编译
Babel的目的就是让你可以使用最新的标准来开发,然后把兼容的问题交给它来完成.比如我如何在使用ES6的语法写完之后将其转换为ES5满足通用性呢? 先用这个最常用的Babel的用法来引入吧. 一 首 ...
- Linux基础命令(一)
一.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语没有图形界面 二.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 Ctrl + Alt + F ...
- django 表单系统 之 forms.ModelForm
继承forms.ModelForm类实现django的表单系统 有时,我们在前端定义的<form>表单和后端定义的model结构基本上是一样的,那么我们可以直接在后端定义model后,定义 ...
- python 作用域知识点整理
1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? 1 2 3 4 5 6 7 8 9 10 11 12 #块级作用域 if 1 == 1: name = "lzl ...