最近写程序当中需要做一个表单提交(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); }第四步,运行。