最近写程序当中需要做一个表单提交(WinForm)当所有的表单项目符合要求时提交按钮为可用否则不可用一般我们需要写一个验证的函数然后触发TextBox的某个事件来调用函数函数中记录下是否所有的表单项目都符合要求是则提交按钮可用 关于自验证本文框在CodeProject上找到了TextBoxRegex是一个不错的自验证TextBox 关于Observer模式按照四人团的说法Observer 模式的意图是定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并自动更新 直接给代码 第一步定义两个接口 IObserver接口 publicinterfaceIObserver { voidUpdate(); voidAttach(ISubjectsub); voidDetach(ISubjectobs); IListMySubject{get;} } ISubject接口 publicinterfaceISubject { IListMyObserver{get;} voidAttach(IObserverobs); voidDetach(IObserverobs); voidNotify(); boolIsValided(); } 第二步写TextBoxButton控件这里用到了TextBoxRegex TextBox控件 publicclassCNWTextbox:TextBoxRegexISubject { privateArrayListobsList; publicCNWTextbox() { obsList=newArrayList(); thisUseInvalidTextException=true; } ISubject成员#regionISubject成员 publicIListMyObserver { get{returnobsList;} } publicvoidAttach(IObserverobs) { obsListAdd(obs); obsAttach(this); } publicvoidDetach(IObserverobs) { obsListRemove(obs); obsDetach(this); } publicvoidNotify() { foreach(IObserverobsinobsList) { obsUpdate(); } } #endregion protectedoverridevoidOnTextChanged(EventArgse) { baseOnTextChanged(e); //通知所有Observer更新自己 Notify(); } publicboolIsValided() { try { stringtemp=thisTextValidated; returntrue; } catch(ChopeenInvalidTextExceptionex) { ConsoleWriteLine(exToString()); returnfalse; } } } Button控件 publicclassCNWButton:ButtonIObserver { privateArrayListmySubjects; publicCNWButton() { mySubjects=newArrayList(); } IObserver成员#regionIObserver成员 voidIObserverUpdate() { foreach(ISubjectsubinmySubjects) { if(subIsValided()) { thisEnabled=true; } else { thisEnabled=false; break; } } } voidIObserverAttach(ISubjectsub) { mySubjectsAdd(sub); } voidIObserverDetach(ISubjectsub) { mySubjectsRemove(sub); } SystemCollectionsIListIObserverMySubject { get{returnmySubjects;} } #endregion } 第三步使用 cnwTextboxcnwTextboxcnwButton是上面制作的控件 privatevoidForm_Load(objectsenderEventArgse) { cnwTextboxAttach(cnwButton); cnwTextboxAttach(cnwButton); } 第四步运行 |