最近寫程序當中需要做一個表單提交(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();

}
第二步寫TextBoxButton控件這裡用到了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

}
第三步使用
cnwTextboxcnwTextboxcnwButton是上面制作的控件

private void Form
_Load(object sender
EventArgs e)

{

cnwTextbox
Attach(cnwButton
);

cnwTextbox
Attach(cnwButton
);

}
第四步運行




From:http://tw.wingwit.com/Article/program/net/201311/13047.html