电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

自验证文本框和Observer模式


发布日期:2022/10/2
 

最近写程序当中需要做一个表单提交(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);

}

第四步运行

上一篇:Page.Ispostback属性详解

下一篇:析构函数用于销毁类的实例