前些日子从研究所临时调回公司,帮忙做另外一个项目的控件验证工作,其实内容非常的简单,就是将用户即将提交至服务器的数据先做一个本地验证,以达到减少服务器压力、提高用户体验的目的。

附上一张图片
  这是官方给的一个Demo,各种例子和示例代码,尽管全是英文的,但是对于我这个连2级都没过的人来说也没啥难度,所以不难看出官方的Demo真的是做得很用心。
 
  该控件的大体使用方法是这样的:
    1、声明验证控件(DxValidationProvider),当然一般都是直接拖的;
    2、声明规则,由于不同的控件的适用规则不同,所以肯定会声明许多规则;
    3、规则与控件的绑定;
    4、DxValidationProvider执行验证;
  起初的时候,并没有发觉什么难度,但是到了后面测试的时候就发现问题了。比如在同一个界面下,存在选择的情况,则应该只验证被选中的控件,未选中的控件不论输入值正确与否都不应该验证,但是根据上面提及的顺序,会发现根本就没有撤销绑定的操作,于是博主找了很久也没有找到撤销绑定的方法,
接着,并尝试了动态创建DxValidationProvider控件,大体逻辑和上面一样,区别就是DxValidationProvider控件为动态生成,作为局部变量理应存在生命周期,即第二次执行同样方法的时候上一次应该被回收了,但是很奇怪的事情又发生了,动态创建没有问题,问题是上一次的结果还在。
 
  博主非常蛋疼啊,偶然间调用了DxValidationProvider控件的Dispose()方法后,发现DxValidationProvider实例化的对象还是没有被回收!只是清空了他的一些数据而已,博主瞬间凌乱了。加上声明规则也是一个复杂的过程,于是楼主最后封装了几个类,在这里和大家分享分享。
 
public class CustomValidation
{
private DXValidationProvider provider; /// <summary>
/// 条件列表
/// </summary>
public List<ControlRule> RuleList { get; set; } public CustomValidation()
{
provider = new DXValidationProvider();
} /// <summary>
/// 执行验证
/// </summary>
/// <returns></returns>
public bool Validate()
{
bool flag = true;
if (provider != null)
{
provider.Dispose();
}
if (RuleList != null)
{
foreach (ControlRule item in RuleList)
{
provider.SetIconAlignment(item.control, ErrorIconAlignment.MiddleRight);
provider.SetValidationRule(item.control, item.rule);
//if (!provider.Validate() && flag)
//{
// flag = false;
//}
}
flag = provider.Validate();
}
else
{
flag = false;
}
return flag;
}
}

自定义验证类

public class CustomRuleByRegex : ValidationRule
{
string regex;
bool isnotblank;//是否为空
/// <summary>
/// 是否为数字
/// </summary>
public static string strIsNumeric = "^[\\+\\-]?[0-9]*\\.?[0-9]+$";
/// <summary>
/// 电话号码
/// </summary>
public static string strPhone = @"(^(\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$|(1(([35][0-9])|(47)|[8][01236789]))\d{8}$"; /// <summary>
/// 使用正则表达式验证
/// </summary>
/// <param name="regex">正则表达式</param>
/// <param name="isnotblank">是否允许为空</param>
public CustomRuleByRegex(string regex, bool isnotblank)
{
this.regex = regex;
this.isnotblank = isnotblank;
} public override bool Validate(Control control, object value)
{
bool flag;
try
{
if (value == null || value.ToString().Trim() == string.Empty)
{
if (isnotblank)
{
flag = true;
}
else
{
flag = false;
this.ErrorText = "该值不允许为空!";
}
}
else
{
flag = Regex.IsMatch((string)value, regex);
}
}
catch (Exception ex)
{
this.ErrorText = ex.Message;
flag = false;
}
return flag;
}
}

自定义规则类

public class ControlRule
{
public Control control;
public ValidationRule rule; public ControlRule(Control control, ValidationRule rule)
{
this.control = control;
this.rule = rule;
} /// <summary>
/// 判断控件是否为空
/// </summary>
/// <returns></returns>
public static ConditionValidationRule NotEmpty()
{
ConditionValidationRule rule = new ConditionValidationRule();
rule.ConditionOperator = ConditionOperator.IsNotBlank;
rule.ErrorText = "该值不允许为空!";
return rule;
} /// <summary>
/// 判断是否大于等于某个数
/// </summary>
/// <param name="number">数值</param>
public static ConditionValidationRule NoLessNumber(decimal number)
{
ConditionValidationRule rule = new ConditionValidationRule();
rule.ConditionOperator = ConditionOperator.GreaterOrEqual;
rule.ErrorText = string.Format("该值不能小于{0}!", number);
rule.Value1 = number;
return rule;
} /// <summary>
/// 判断是否大于某个数
/// </summary>
/// <param name="number">数值</param>
public static ConditionValidationRule GreaterNumber(decimal number)
{
ConditionValidationRule rule = new ConditionValidationRule();
rule.ConditionOperator = ConditionOperator.Greater;
rule.ErrorText = string.Format("该值必须大于{0}!", number);
rule.Value1 = number;
return rule;
} /// <summary>
/// 判断是否在指定数(包含)之间
/// </summary>
/// <param name="small">小数</param>
/// <param name="big">大数</param>
/// <returns></returns>
public static ConditionValidationRule BetweenNumbers(decimal small, decimal big)
{
ConditionValidationRule rule = new ConditionValidationRule();
rule.ConditionOperator = ConditionOperator.Between;
rule.ErrorText = string.Format("该值不能小于{0}且不能大于{1}!", small, big);
rule.Value1 = small;
rule.Value2 = big;
return rule;
} /// <summary>
/// 判断结束时间是否不小于指定时间
/// </summary>
/// <param name="startTime">指定时间</param>
public static ConditionValidationRule NoLessDate(DateTime startTime)
{
ConditionValidationRule rule = new ConditionValidationRule();
rule.ErrorText = string.Format("结束时间不能小于开始时间!");
rule.ConditionOperator = ConditionOperator.GreaterOrEqual;
rule.Value1 = startTime;
return rule;
} /// <summary>
/// 调用正则表达式判断输入格式
/// </summary>
/// <param name="strRex">正则表达式</param>
/// <param name="isnotblank">是否允许为空</param>
public static CustomRuleByRegex AddValueRex(string strRex, bool isnotblank)
{
CustomRuleByRegex rule = new CustomRuleByRegex(strRex, isnotblank);
rule.ErrorText = "输入格式不正确,请重新输入!";
return rule;
}
}

控件规则类

private CustomValidation myvalidation = new CustomValidation();

/// <summary>
/// 获取条件列表
/// </summary>
/// <returns></returns>
private List<ControlRule> GetRuleList()
{
List<ControlRule> rulelist = new List<ControlRule>();
//起始时间
rulelist.Add(new ControlRule(datS_Time, ControlRule.NotEmpty()));
rulelist.Add(new ControlRule(datE_Time, ControlRule.NoLessDate(Convert.ToDateTime(datS_Time.EditValue))));
//高级
if (layoutControlItem2.Visibility == LayoutVisibility.Always)
{
if (cSCMoreThan.Checked)
{
rulelist.Add(new ControlRule(spin_TalkingLongGreater, ControlRule.NoLessNumber()));
}
}
return rulelist;
} //验证
private bool OperateValidate()
{
bool flag = true;
//输入参数基本验证
myvalidation.RuleList = GetRuleList();
if (!myvalidation.Validate())
{
flag = false;
}
return flag;
}

使用范例

[DevExpress]DxValidationProvider分享的更多相关文章

  1. DevExpress之GridControl控件小知识

    DevExpress之GridControl控件小知识 一.当代码中的DataTable中有建数据关系时,DevExpress 的 GridControl 会自动增加一个子视图 .列名也就是子表的字段 ...

  2. DevExpress.XtraGrid winform试用分享

    DevExpress.XtraGrid在winform里使用还挺麻烦,为了减少重复代码和代码复用,本人针对DevExpress.XtraGrid封装了一个Form的基类,其中涵盖了DevExpress ...

  3. 干货分享!DevExpress v17.1最新版帮助文档下载大全

    DevExpress v17.1.5帮助文档下载列表大全来啦!包含.NET.VCL.HTML/JS系列所有帮助文档,提供CHM和PDF两个版本.除已停止更新的Silverlight.Windows 8 ...

  4. Devexpress GridView 数据格式化显示

    gridView1.CustomColumnDisplayText += gridView1_CustomColumnDisplayText; void gridView1_CustomColumnD ...

  5. 【C#】分享带等待窗体的任务执行器一枚

    -------------201504161039更新------------- 更新内容: IWaitForm接口删除System.Windows.Forms.DialogResult Dialog ...

  6. DevExpress的GridControl的实时加载数据解决方案(取代分页)

    http://blog.csdn.net/educast/article/details/4769457 evExpress是一套第三方控件 其中有类似DataGridView的控件 今天把针对Dev ...

  7. 关于 DevExpress.XtraTreeList.TreeList 树形控件 的操作

    作为一个C#程序员,在写程序时一直以来都使用的微软那一套控件,用起来特别爽,可是最近公司的一个项目用到了DevExpress框架,不用不知道,一用吓一跳,不得不承认这个框架确实很强大,效果也很炫,但是 ...

  8. DevExpress实现为TextEdit设置水印文字

    本文实例展示了DevExpress实现为TextEdit设置水印文字的方法,是一个很实用的技巧.分享给大家供大家参考. 转自 http://blog.csdn.net/yh0503/article/d ...

  9. 完美演绎DevExpress XtraPrinting Library 的打印功能

    完美演绎DevExpress XtraPrinting Library 的打印功能 2010-05-14 17:40:49|  分类: 默认分类|字号 订阅     设计报告不仅费时间,而且还乏味!但 ...

随机推荐

  1. SSIS执行SQL任务时加入参数

    昨天开发的SSIS包中,获取ERP系统parttran表时,数据量比较大,达到255万多,因为SQL执行的关系,致使处理时效率很慢,所以就想用增量更新的方法处理该表数据.这是增量更新的SQL任务集合, ...

  2. C++/C#/java开发支持求解

    本人大一学C语言,大二学VB,大三学VC,毕业后工作前两年用C++,接着两年用C#,最近几个月Android开发用Java. 以下本人总结以下,有些疑惑希望大师帮忙解答. 1. C语言,精简,灵活,适 ...

  3. 关于WinRT中c++和c#相互调用的问题

    先说结论(不见得是最终正确的结论,不过google了一晚上也没有查出个所以然来,即便有解决方法我也认为是微软傻x): 首先c#和c++理所应当的不应该在同一个工程中,而只能是同一个工程的两个项目.只能 ...

  4. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释 linux中shell变量$#,$@,$0,$1,$2的含义解释:  变量说明:  $$  Shell本身的PID(ProcessID ...

  5. [Javascript] bukld 'SQL' like object tree

    Let's try creating a deeper tree structure. This time we have 4 separate arrays each containing list ...

  6. 开启一个指定action的Activity

    开启一个指定action的Activity如果你想要使用android系统自带的一些服务,如照相机,通信录,打电话等,那么你就得需要知道对应服务(也就是在AndroidManifest.xml中< ...

  7. 【转】Java web 编解码

    几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言 ...

  8. (转)十分钟搞定CSS选择器

    原文地址:http://www.cnblogs.com/dolphinX/p/3347713.html 在最近的web开发中是不是就会用到一些选择器,发现很多尤其是CSS3新增的不太熟悉,在此总结一下 ...

  9. Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 1.跳转到拨号界面,代码如下: 1)直接拨打 Intent intentPhone = new Intent ...

  10. css-01

    1.CSS:级联样式表,设置页面的样式 2.css基本的语法:     属性:值; 3.CSS的引入   |-1.元素内容的引入:内联样式       <元素名 style="属性:值 ...