一个简单的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实现自动验证功能的更多相关文章

  1. WinForm应用程序中实现自动更新功能

    WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...

  2. thinkPHP 表单自动验证功能

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

  3. <转>thinkphp自动验证无效的问题

    新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...

  4. ThinkPHP 自动验证实例

    //array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),protected $_validate = array( ); ThinkPHP 自动验证定义的附加规则如下: r ...

  5. tinkphp中的自动验证

    tinkphp是国内非常流行的一个开源框架,国内大小公司都在用的框架.对于初学的好多同学感觉不太好上手,其实并没没有大家想的那么复杂.自动验证功能是thinkphp提高的一种数据验证方法,分为动态和静 ...

  6. thinkphp自动验证无效的问题

    新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...

  7. Winform(C#.NET)自动更新组件的使用及部分功能实现

    声明:核心功能的实现是由园子里圣殿骑士大哥写的,本人是基于他核心代码,按照自己需求进行修改的.   而AutoUpdaterService.xml文件生成工具是基于评论#215楼 ptangbao的代 ...

  8. Winform(C#.NET)自动更新组件的使用及部分功能实现(一点改进功能)

    接前两篇继续: Winform(C#.NET)自动更新组件的使用及部分功能实现 Winform(C#.NET)自动更新组件的使用及部分功能实现(续) 借鉴文章:http://www.cnblogs.c ...

  9. Winform(C#.NET)自动更新组件的使用及部分功能实现(续)

    接昨天的文章Winform(C#.NET)自动更新组件的使用及部分功能实现 强制更新的实现部分: 将DownloadConfirm窗体修改成单纯的类 public class DownloadConf ...

随机推荐

  1. (转)java 静态内部类

    转自:http://blog.sina.com.cn/s/blog_605f5b4f0100zbps.html 参考:http://docs.oracle.com/javase/tutorial/ja ...

  2. 根本上解决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),更新到了最新版本,这个问题就 ...

  3. [Algorithms] KMP

    KMP is a classic and yet notoriously hard-to-understand algorithm. However, I think the following tw ...

  4. pc端和移动端的区别

    以下都是自己的个人理解,说错了希望大家多交流交流.1,普通pc端开发与移动端开发区别.普通pc端开发,我理解就是你拿电脑打开的网页都算[这相信大部分人都知道].那么移动端开发工程师,说白了就很好理解了 ...

  5. ESX 5.0 上运行虚拟ESX

    如何在ESX上安裝ESX需注意幾點: 1.Guest OS選Linux / Red Hat Enterprise Linux 5 (64-bit) 2.使用SSH連線實體ESX主機下指令 添加*.vm ...

  6. Extjs combobox 实现搜索框的效果

    目的:使用combobox实现一个类似搜索框的效果,即用户输入内容后,出现相关下列列表,提供选择. 实现:extjs3 中combobox自身带这个功能即在remote模式下,store在load的时 ...

  7. Babel编译

    Babel的目的就是让你可以使用最新的标准来开发,然后把兼容的问题交给它来完成.比如我如何在使用ES6的语法写完之后将其转换为ES5满足通用性呢? 先用这个最常用的Babel的用法来引入吧. 一  首 ...

  8. Linux基础命令(一)

    一.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语没有图形界面 二.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 Ctrl + Alt + F ...

  9. django 表单系统 之 forms.ModelForm

    继承forms.ModelForm类实现django的表单系统 有时,我们在前端定义的<form>表单和后端定义的model结构基本上是一样的,那么我们可以直接在后端定义model后,定义 ...

  10. python 作用域知识点整理

    1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? 1 2 3 4 5 6 7 8 9 10 11 12 #块级作用域   if 1 == 1:     name = "lzl ...