Windows Forms 的验证器——ValidationProvider 控件






4.69/5 (64投票s)
2005年4月11日
3分钟阅读

393543

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
的目标是将所有这些精彩的想法汇集在一起并加以简化。
设计
- 为了加快开发速度,Noogen
ValidationProvider
重用了 WebForm 验证器基类引擎,并使用ErrorProvider
控件显示错误(因此得名ValidationProvider
)。 - 我的第二个目标是提供像 WebForm 中那样简单的基本/熟悉的验证配置,包括:数据类型检查、必填字段、范围和值比较验证等!
- Noogen
ValidationProvider
还可以测试和验证正则表达式,甚至可以配置更高级的自定义验证。
我在这里停下,以免离题太远。当然,如果您希望深入了解细节,所有源代码都已提供。
使用代码
基本验证
ValidationProvider
可以轻松地为 TextBox
和 ComboBox
控件设置验证。您无需编写一行代码。只需以发布模式编译附带的源代码,然后在 VS.NET IDE 工具箱中浏览并添加它,将其拖到窗体上,然后您就可以开始可视化地设计您的输入验证了。
ValidationProvider
属性会在“属性窗口”中公开“编辑验证规则”链接/动词。我还实现了 IExtenderProvider
以方便地编辑特定 ValidationRule
与单个 TextBox
或 ComboBox
控件的绑定。
您唯一需要编写的代码如下所示
//
// 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.Design
和 ValidationProvider
放在了一个项目中。您可能希望为您的 ValidationProvider
构建命名,以区分设计器和提供程序。这将减小程序集大小,因为设计器在部署时是不需要的。
历史
- 2005 年 4 月 11 日 - 发布
ValidationProvider
1.0。