更进一步,实现其它验证组件
通过使用基类和派生类将通用逻辑和特定逻辑分离后,我们可以把注意力集中在特定的验证逻辑,这在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岁:
如果小于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;
}
}
