65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Forms 的验证器——ValidationProvider 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (64投票s)

2005年4月11日

3分钟阅读

viewsIcon

393543

downloadIcon

11227

TextBox、ComboBox 等控件的代码级验证...

引言

您是否花费大量时间编写自定义 Windows Forms 验证?您是否曾希望拥有一个像 WebForm 中那样的 WinForm 验证器?Noogen ValidationProvider 可以通过提供强大、简单且几乎无需编写代码的输入验证配置来帮助您加快 WinForms 设计速度。

背景

对于初学者,我建议阅读 Paul Riley 关于 ASP.NET/WebForms 中验证器的文章 - ASP.NET Validators Unclouded。这是因为 ValidationProvider 引擎源自 WebForm Validators 基类。

Noogen ValidationProvider 还构建在 ErrorProvider 之上,请参阅 Naveen K. Kohli 的文章 - 如何使用 ErrorProvider 对象指示控件状态无效

我知道这个主题已经被讨论过很多次(例如 MSDN 文章 - 使用自定义验证组件库扩展 Windows Forms,第三部分),但我所见的大多数文章要么过于局限于单个控件(TextBox),要么过于复杂。我的 Noogen ValidationProvider 的目标是将所有这些精彩的想法汇集在一起并加以简化。

设计

  1. 为了加快开发速度,Noogen ValidationProvider 重用了 WebForm 验证器基类引擎,并使用 ErrorProvider 控件显示错误(因此得名 ValidationProvider)。
  2. 我的第二个目标是提供像 WebForm 中那样简单的基本/熟悉的验证配置,包括:数据类型检查、必填字段、范围和值比较验证等!
  3. Noogen ValidationProvider 还可以测试和验证正则表达式,甚至可以配置更高级的自定义验证。

我在这里停下,以免离题太远。当然,如果您希望深入了解细节,所有源代码都已提供。

使用代码

基本验证

ValidationProvider 可以轻松地为 TextBoxComboBox 控件设置验证。您无需编写一行代码。只需以发布模式编译附带的源代码,然后在 VS.NET IDE 工具箱中浏览并添加它,将其拖到窗体上,然后您就可以开始可视化地设计您的输入验证了。

ValidationProvider 属性会在“属性窗口”中公开“编辑验证规则”链接/动词。我还实现了 IExtenderProvider 以方便地编辑特定 ValidationRule 与单个 TextBoxComboBox 控件的绑定。

您唯一需要编写的代码如下所示

//
// Call Noogen ValidationProvider public method - 
// Validate() and display error if returns false.
//
this.validationProvider1.ValidationMessages(
                      !this.validationProvider1.Validate());

公共方法

CanExtend 确定 ValidationProvider 是否支持某个组件。
GetIconAlignment 获取错误图标的对齐方式。
GetIconPadding 获取错误图标的内边距。
GetValidationRule 获取验证规则。
SetIconAlignment 设置错误图标的对齐方式。
SetIconPadding 设置错误图标的内边距。
SetValidationRule 设置验证规则。
Validate 重载。对所有控件执行验证。
ValidationMessages 获取验证错误消息。

正则表达式验证

ValidationProvider 可以测试和验证正则表达式(RegEx)。为了方便您使用,提供了一个 RegEx 测试台。RegEx 测试值应用相同的验证引擎,数据在您输入时即会被验证。您可以使用 RegEx 配置非常强大和高级的验证。通过创意,我相信您几乎可以使用它来代替所有基本验证,但 RegEx 的推导可能很复杂。因此,您可能会使用 RegEx 验证来补充提供的基本验证。演示应用程序演示了简单的电子邮件和数据长度正则表达式验证。

如果您以前使用过正则表达式,那么您可能已经收集了一些喜欢的 RegEx 模式。ValidationProvider 允许您加载您收集的 RegEx 模式,以便您可以一致地重用它并与您的开发人员朋友共享。您只需编辑并将您的 RegEx 集合添加到附带的文件“RegExPatternStore.xml”中,如上面的动画所示。

自定义验证

好的,我撒谎了!上面的代码不是您唯一需要编写的代码。当业务逻辑变得复杂或需要验证 ValidationProvider 不支持的控件时,可以像这样将自定义验证方法配置到 ValidationProvider

//
// Create new ValidationRule and wire-up custom validation method.  
// This can be somewhere in the ctor.
//
Noogen.Validation.ValidationRule vr = new Noogen.Validation.ValidationRule();
vr.CustomValidationMethod += 
 new Noogen.Validation.CustomValidationEventHandler(vr_CustomValidationMethod);
this.validationProvider1.SetValidationRule(this.textBox6, vr);
//
// The custom validation method.
//
private void vr_CustomValidationMethod(object sender, 
                 Noogen.Validation.CustomValidationEventArgs e)
{
   e.IsValid = 
        e.Value.ToString().Equals("abc") || e.Value.ToString().Equals("123") ;
   e.ErrorMessage = "%ControlName% is not in ('abc', '123').";
}

关注点

出于演示目的,我将 Noogen.Validation.DesignValidationProvider 放在了一个项目中。您可能希望为您的 ValidationProvider 构建命名,以区分设计器和提供程序。这将减小程序集大小,因为设计器在部署时是不需要的。

历史

  • 2005 年 4 月 11 日 - 发布 ValidationProvider 1.0。
© . All rights reserved.