扩展方法实现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的界面风格. 其中的控件功 ...
随机推荐
- Chapter 1 First Sight——36
The door opened again, and the cold wind suddenly gusted through the room, rustling the papers on th ...
- Varnish && Varnish Cache
1 1 1 Varnish https://www.varnish-cache.org/intro/index.html#intro Introduction to Varnish The basic ...
- js 数组切换图片
<html> <head> <meta charset="utf-8" /> <title></title> <s ...
- 前端模块化之seajs
决心从java后台转做前端有些日子了,不断关注前端知识.从学习了nodejs的 require按需加载模块的思路之后感觉js的世界变得好美好啊,前几天无意看到了seajs,国内大牛的作品,专为前端js ...
- Unity 的几种打包姿势(android)
Unity 版本 4.3.2 图片1 1 默认的工程进行打包 得到的apk为8.1m(net subset) 图片2 2 代码剥离最小 – use mirco mscorlib 图片3 3 从网上 ...
- FUSE and File System
FUSE: File system in USErspace. So what is a file system? A file system maps file paths to file cont ...
- 自定义AccessDeniedHandler
在Spring默认的AccessDeniedHandler中只有对页面请求的处理,而没有对Ajax的处理.而在项目开发是Ajax又是我们要常用的技术,所以我们可以通过自定义AccessDeniedHa ...
- mysql 常用命令集锦[绝对精华]
一.连接MYSQL. 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u roo ...
- IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re
非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明: 基本概念: 阻塞IO:: socket 的阻塞模式 ...
- 32位Intel CPU所含有的寄存器
4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) ...