技术开发 频道

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


    这种实现的关键在于如何挂接ControlValidate控件的Validating事件,这种做法与前面的控件级验证相一致,还有一个额外的好处,这里的ControlToValidate_Validating方法中,没有设置CancelEventArgs参数的Cancel属性,这样就不会把用户困在一个控件中。

    组件的验证功能已经实现了,同时还为其添加了设计期支持。最终实现还提供了其它一些设计期特性:

<!--[if !supportLists]-->指定了在属性浏览器中设置ControlToValidate时可以选择的控件种类;
    在属性浏览器中隐藏了IsValid属性,因为它是运行时的属性。
    编译,然后将组件添加到工具箱。

    让我们回到前面的AddEmployee窗体,现在不再需要处理Validating事件了,只要拖3个组件到窗体,然后为它们设置属性。



    其中Phone Number域的验证组件的InitialValue为”Your number here.”。怎么样,是不是很high?

    BaseValidator:分而治之

    实现了RequiredFieldValidator后,其它类型的验证组件应当比较容易实现了。先别急,可没你想的那么简单。    RequiredFieldValidator类把特定的”必填”逻辑和其它对每个验证组件都适用的通用逻辑耦合在一起了。这种情况下,应当把RequiredFieldValidator分解为两个类型:BaseValidator和减肥后的RequiredFieldValidator。

abstract class BaseValidator : Component { void Validate() { _isValid = EvaluateIsValid(); } protected abstract bool EvaluateIsValid(); }
    这样定义的效果是,BaseValidator必须通过继承后才能使用,而EvaluateIsValid则必须实现。Validate方法通过EvaluateIsValid方法来设置IsValid。这种技术也应用在了ASP.NET的验证控件上。

    BaseValidator实现后,需要对RequiredFieldValidator进行重构:
[ToolboxBitmap(typeof(RequiredFieldValidator), "RequiredFieldValidator.ico")] class RequiredFieldValidator : BaseValidator { string InitialValue {} protected override bool EvaluateIsValid() { string controlValue = ControlToValidate.Text.Trim(); string initialValue; if( _initialValue == null ) initialValue = ""; else initialValue = _initialValue.Trim(); return (controlValue != initialValue); } }





0
相关文章