技术开发 频道

Windows Forms中通过自定义组件实现统一的数据验证


更进一步,实现其它验证组件

    通过使用基类和派生类将通用逻辑和特定逻辑分离后,我们可以把注意力集中在特定的验证逻辑,这在RequiredFieldValidator中效果不错。下面会看到,对于其它类型的验证组件同样很好,它们是:

<!--[if !supportLists]-->RegularExpressionValidator

CustomValidator

CompareValidator

RangeValidator

现在把它们一一实现。

RegularExpressionValidator

    正则表达式是一种强大的文本模式匹配技术。如果文本域需要一定的模式,正则表达式无疑是很好的选择。
using System.Text.RegularExpressions; [ToolboxBitmap(typeof(RegularExpressionValidator), "RegularExpressionValidator.ico")] class RegularExpressionValidator : BaseValidator { string ValidationExpression {} protected override bool EvaluateIsValid() { // Don't validate if empty if( ControlToValidate.Text.Trim() == "" ) return true; // Successful if match matches the entire text of ControlToValidate string field = ControlToValidate.Text.Trim(); return Regex.IsMatch(field, _validationExpression.Trim()); } }
在设计时,开发人员可以通过属性浏览器提供用于验证的正则表达式。

CustomValidator

    人生在世,不如意者十有八九。我们定义的验证组件不可能解决所有问题,尤其是面对复杂的业务规则的时候。这时只能编写自定义代码,CustomValidator 允许我们编写这些自定义代码,同时仍能与其它的验证组件保持一致,这在窗体级的统一验证过程中很重要。CustomValidator 提供了Validating事件和ValidatingCancelEventArgs:

    处理CustomValidator的Validating事件时,只需在属性浏览器中双击:



然后,只需添加合适的验证逻辑,以确保新增的雇员不小于18岁:

private void customValidator1_Validating(object sender, CustomValidator.ValidatingCancelEventArgs e) { DateTime birth; bool isDate = DateTime.TryParse(txtBirth.Text, out birth); if (isDate) { DateTime legal = DateTime.Now.AddYears(-18); e.Valid = (birth <= legal); } else { e.Valid = false; } }
如果小于18岁,就会提示用户:

 




0
相关文章