扩展方法实现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的界面风格. 其中的控件功 ...
随机推荐
- wamp本地能访问,但局域网不能访问的解决办法
Apache的配置文件.
- PHP:var_dump展示不全
问题:var_dump展示不全,出现省略号 我们使用php的var_dump函数,可以更直观的查看输出结果,包括类型,数量等详细信息.此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值.数 ...
- freemarker中的list 前端模板
freemarker list (长度,遍历,下标,嵌套,排序)1. freemarker获取list的size : JavaArrayList<String> list = new Ar ...
- 移植WL18XX到高通的时候,会出现几个.KO文件没有编译出来的情况
1.检查kernel的.config文件,看是否有CONFIG又恢复了.这个时候就要需找依赖.把依赖使能 2.然后再去驱动源码检查 KCONFIG 的依赖,使能改使能的配置就可以了.
- 简单粗暴的“Debug模式”
在项目中,通常会遇到:调试程序和程序在线上运行时程序运行的参数不一样, 例如线上运行时程序是获取线上的机器的ip,而调试程序时,我们会指定一个ip进行调试. 又或者项目要与多个系统进行数据交换,调试的 ...
- java中的类修饰符、成员变量修饰符、方法修饰符
类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fi ...
- 【转】使用ThinkPHP必须掌握的调试方法
经常看到有人问到findAll的返回数据类型是什么之类的问题,以及出错了不知道什么原因的情况,其实还是没有熟悉ThinkPHP内置的调试手段和方法,抛开IDE本身自带的调试方式不说,如果你正在用或者打 ...
- preg_replace 方法
标红关键字 $text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. ...
- iOS拨打电话(三种方法)
iOS拨打电话(三种方法) 查了很多地方的关于iOS程序拨打电话,大都不全,今天我总结了三种方法,各有不同,拿来给大家分享,希望给大家有所帮助 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯 ...
- 视频录制SurfaceView
package com.bw.videorecorder; import java.io.File;import java.io.IOException; import android.media.M ...