最近写程序当中需要做一个表单提交(WinForm),当所有的表单项目符合要求时,提交按钮为可用,否则不可用,一般我们需要写一个验证的函数,然后触发TextBox的某个事件来调用函数,函数中记录下是否所有的表单项目都符合要求,是则提交按钮可用。
关于自验证本文框,在CodeProject上找到了TextBoxRegex,是一个不错的自验证TextBox。
关于Observer模式,按照四人团的说法,Observer 模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新”。
直接给代码:
第一步,定义两个接口
IObserver接口:
public interface IObserver
...{
void Update();
void Attach(ISubject sub);
void Detach(ISubject obs);
IList MySubject ...{ get; }
}
ISubject接口:
public interface ISubject
...{
IList MyObserver ...{ get ; }
void Attach(IObserver obs);
void Detach(IObserver obs);
void Notify();
bool IsValided();
}
第二步,写TextBox、Button控件。这里用到了TextBoxRegex。
TextBox控件:
public class CNWTextbox : TextBoxRegex, ISubject
...{
private ArrayList obsList;
public CNWTextbox()
...{
obsList = new ArrayList();
this.UseInvalidTextException = true;
}
ISubject 成员#region ISubject 成员
public IList MyObserver
...{
get ...{ return obsList; }
}
public void Attach(IObserver obs)
...{
obsList.Add(obs);
obs.Attach(this);
}
public void Detach(IObserver obs)
...{
obsList.Remove(obs);
obs.Detach(this);
}
public void Notify()
...{
foreach (IObserver obs in obsList)
...{
obs.Update();
}
}
#endregion
protected override void OnTextChanged(EventArgs e)
...{
base.OnTextChanged(e);
//通知所有Observer更新自己。
Notify();
}
public bool IsValided()
...{
try
...{
string temp = this.TextValidated;
return true;
}
catch (Chopeen.InvalidTextException ex)
...{
Console.WriteLine(ex.ToString());
return false;
}
}
}
Button控件:
public class CNWButton:Button,IObserver
...{
private ArrayList mySubjects;
public CNWButton()
...{
mySubjects = new ArrayList();
}
IObserver 成员#region IObserver 成员
void IObserver.Update()
...{
foreach (ISubject sub in mySubjects)
...{
if (sub.IsValided())
...{
this.Enabled = true;
}
else
...{
this.Enabled = false ;
break;
}
}
}
void IObserver.Attach(ISubject sub)
...{
mySubjects.Add(sub);
}
void IObserver.Detach(ISubject sub)
...{
mySubjects.Remove(sub);
}
System.Collections.IList IObserver.MySubject
...{
get ...{ return mySubjects; }
}
#endregion
}
第三步,使用。
cnwTextbox4,cnwTextbox5,cnwButton1是上面制作的控件。
private void Form1_Load(object sender, EventArgs e)
...{
cnwTextbox4.Attach(cnwButton1);
cnwTextbox5.Attach(cnwButton1);
}
第四步,运行。
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。