扩展方法实现DevExpress控件校验
DevExpress控件中,如果要控件的值进行校验,需要用到DXValidationProvider控件和DXErrorProvider控件,按照正常思路,无论使用哪个控件要实现校验效果时都需要对每个要校验的控件进行校验规则绑定,在这,写一个扩展方法实现一劳永逸的效果。
扩展代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DevExpress.XtraEditors.DXErrorProvider;
using System.Windows.Forms; namespace ValidateForm
{
///<summary>
///验证值是否存在的验证规则
///</summary>
public class CustomValidationRule : ValidationRule
{
public CustomValidationRule(Func<object, bool>validationFunction)
{
this.ValidateFunction = validationFunction;
} ///<summary>
///获取或设置验证方法
///</summary>
Func<object, bool>ValidateFunction { get; set; } ///<summary>
///验证待验证控件的值是否已存在
///</summary>
///<param name="control">待验证控件。</param>
///<param name="value">待验证控件的值</param>
///<returns>如果值已存在,返回false;否则返回true。</returns>
public override bool Validate(System.Windows.Forms.Control control, object value)
{
if (this.ValidateFunction == null)
throw new InvalidOperationException("必须设置ValidateFunction属性");
return ValidateFunction(value);
}
} public static class DXValidationExtension
{ static Dictionary<int, Dictionary<int, List<DXValidationProvider>>>providerDictionary; static DXValidationExtension()
{
providerDictionary = newDictionary<int, Dictionary<int, List<DXValidationProvider>>>();
} ///<summary>
///对控件容器中的待验证控件进行验证,并返回验证结果。
///</summary>
///<param name="container">控件容器</param>
///<returns></returns>
public static bool DXValidate(this Control container)
{
bool isValid = true;//验证结果 foreach (vardictinGetProviderDictionary(container))
{
foreach (var provider indict.Value)
{
if (!provider.Validate())
{
//任何一个未通过验证,则设置验证结果为false
isValid = false;
//待验证控件中的任何一个验证规则未通过,立即退出,不再验证该控件的其他规则
break;
}
}
}
return isValid;
} public static void CustomValidation(this Control container, Control controlToValidate, string errorText,
Func<object, bool> validate)
{
CustomValidation(container, controlToValidate, errorText, validate, false, true);
} private static void CustomValidation(this Control container, Control controlToValidate, string errorText, Func<object, bool> validate, bool alignRight, bool manualValidation)
{
//获得带验证的控件的DXValidationProvider集合。
var dictionary = GetProviderDictionary(container);
var providers = GetProvider(controlToValidate, dictionary);
var provider = new DXValidationProvider();
provider.ValidationMode = manualValidation ? ValidationMode.Manual : ValidationMode.Auto;
provider.SetIconAlignment(controlToValidate, alignRight ? ErrorIconAlignment.MiddleRight : ErrorIconAlignment.MiddleLeft); provider.SetValidationRule(controlToValidate, newCustomValidationRule(validate)
{
ErrorText = errorText,
}); // 将DXValidationProvider添加到待验证控件的DXValidationProvider集合中。
providers.Add(provider);
} ///<summary>
///返回待验证控件的DXValidationProvider集合
///</summary>
///<param name="controlToValidate">待验证控件</param>
///<param name="dictionary">待验证控件所在的字典表</param>
///<returns></returns>
private static List<DXValidationProvider>GetProvider(Control controlToValidate, Dictionary<int, List<DXValidationProvider>> dictionary)
{
var key = controlToValidate.GetHashCode();
if (dictionary.ContainsKey(key))
return dictionary[key];
else
{
var providers = newList<DXValidationProvider>();
dictionary.Add(key, providers);
return providers;
}
} ///<summary>
///返回空间容器的待验证控件字典
///</summary>
///<param name="container"></param>
///<returns></returns>
private static Dictionary<int, List<DXValidationProvider>>GetProviderDictionary(Control container)
{
var key = container.GetHashCode();
if (providerDictionary.ContainsKey(key))
{
return providerDictionary[key];
}
else
{
var providers = newDictionary<int, List<DXValidationProvider>>();
providerDictionary.Add(key, providers);
return providers;
}
}
}
}
程序调用代码示例如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ValidateForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitValidateRoles();
}
private void InitValidateRoles()
{
this.CustomValidation(calcEdit1, "请输入大于0小于20的值", value =>
{
returnConvert.ToInt32(calcEdit1.EditValue) > &&Convert.ToInt32(calcEdit1.EditValue) <;
});
}
private void simpleButton1_Click(object sender, EventArgs e)
{
if (!this.DXValidate())
return;
}
}
}
效果如图:

扩展方法实现DevExpress控件校验的更多相关文章
- DevExpress 控件汉化方法
Ø 简介 本文介绍下 DevExpress 控件的汉化方法,对于英文不怎么好的同学来说,还是非常有必要的.DevExpress 汉化分为运行时汉化,和设计时汉化. 1. 运行时汉化 1) 首 ...
- 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择
在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...
- DevExpress控件安装、汉化使用教程
前言 DevExpress是一个庞大的控件库,也很是好用(没用过,听说),但是要收费. 网上关于DevExpress的教程满天飞,我找了一下午也没找到正确的安装.简单实用教程,还是自己摸索吧. 自己动 ...
- DevExpress控件开发常用要点(项目总结版)
使用DevExpress控件来做项目开发已经有很长一段时间了,在摸索开发到客户苛刻要求的过程中,其中碰到过很多问题需要解决的,随着一个个问题的解决,也留下很多对DevExpress控件的使用经验及教训 ...
- DevExpress控件使用之RichEditControl的使用
原文:DevExpress控件使用之RichEditControl的使用 做Winform的,我们一般都知道,传统.NET界面有一个RichTextBox控件,这个是一个富文本控件,可以存储图片文字等 ...
- DevExpress控件学习总结(转)
DevExpress控件学习总结 1.Navigation & Layout 1.1 Bar Manager 如果想在窗体或用户控件(user control)上添加工具条(bars)或弹 ...
- DevExpress控件的一些快捷操作
用的DevExpress控件时,有一些操作并不太方便,根据我自己需要的封装了一些控件的事件,调用的时候直接绑定控件的事件就可以了 例如: this.ComboBoxEdit.KeyDown += Ct ...
- DevExpress控件库 开发使用经验总结3 制作项目安装包
2015-01-27 使用DevExpress控件包开发C/S项目完成后,部署前需要制作本地安装包.本文还是使用“SetupFactory”安装工厂来制作安装包.在以前的系列文章中详细介绍过该工具的使 ...
- DevExpress控件库 开发使用经验总结1 DevExpress简介、安装、使用
2015-01-24 最近公司开发的WinForm客户端图书行业ERP管理系统,界面端采用了DevExpress控件库.界面效果非常绚丽,类似于Office2007.2010的界面风格. 其中的控件功 ...
随机推荐
- VC++中使用ADO方式操作ACCESS数据库
ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为 ...
- tableview cell添加3D动画
当cell显示之前,会先调用该方法,因此给cell添加动画,在这个方法里面即可. -(void)tableView:(UITableView *)tableView willDisplayCell:( ...
- JedisConnectionException: Unexpected end of stream.
在实际项目中遇到redis读取时报错. 报错是 [ERROR] redis.clients.jedis.exceptions.JedisConnectionException: Unexpected ...
- aspx中如何加入javascript
Response.Write("<script>window.location ='aaa.aspx';</script>"); Response.Writ ...
- 升级3.2.3后 could not find driver
求解,之前一切正常,升级3.2.3后提示找不到数据库驱动我用的是mysql,也没有设置DB_DSN错误位置FILE: C:\Users\Administrator\workspace\test\Thi ...
- Linq第二讲
这一讲,来说说集合.因为linq主要用于对数据源进行查询,集合是最常见的数据源. 集合 形式: 数组,列表List<T> Arraylist等. 特点: 可通过索引或键访问.可进行fore ...
- LeetCode OJ 141. Linked List Cycle
Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...
- 开机启动 sh
我编辑 /etc/init.d/vsftpd 将 nohup java -jar fff.jar & 放在前面 .就执行了
- Django:之传递数据给JS、Ajax和Ajax CSRF认证
Django传递数据给JS 有时候我们想把一个list或者dict传递给javascript,处理后显示到网页上,比如要用js进行可视化到数据. 请注意:如果是不处理,直接显示在网页上,用Django ...
- 使用 Eclipse Memory Analyzer 进行简单内存泄漏分析
Java 内存泄露的根本原因: 保存了不可能再被访问的变量类型的引用.因此我们的目的就是要找出这样的引用. 1.测试代码: public class MainActivity extends Acti ...