日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

.NET圖像界面按鈕的clicked事件淺談_.Net教程

編輯Tag賺U幣

推薦:Asp.net中使用PageDataSource分頁實(shí)現(xiàn)代碼
這篇文章主要介紹asp.net中使用PageDataSource分頁的方法,需要的朋友可以參考下

但是事件并不局限于圖像界面,也可能是滿足程序的某個(gè)邏輯判斷觸發(fā)了事件。引發(fā)事件的對(duì)象叫做事件發(fā)送方,捕獲事件并對(duì)其做出響應(yīng)的對(duì)象叫做事件接收方。但是事件發(fā)送方并不知道哪個(gè)對(duì)象或者方法會(huì)處理它引發(fā)的事件,所以需要在事件發(fā)送方和事件接收方之間存在一媒介,明確某個(gè)對(duì)象或者某個(gè)類型的某個(gè)方法會(huì)對(duì)這個(gè)事件進(jìn)行響應(yīng)。.NET用委托作為事件發(fā)送方與事件接收方之間的媒介,委托只有一個(gè)簽名,只要方法簽名與委托簽名匹配的方法,都可以聲明自己對(duì)這個(gè)委托類型的事件的感興趣,接收并處理它。
事件發(fā)送方的對(duì)象為了給事件接收對(duì)象傳遞一些額外信息,就需要寫一個(gè)派生于System.EventArgs的類,封裝一些數(shù)據(jù)。

復(fù)制代碼 代碼如下:hl5o.cn

public class DrawEventArgs:EventArgs
{
privatedouble m_Size;
public DrawEventArgs(doublesize)
{
m_Size = size;
}
public double Size
{
get
{
returnm_Size;
}
}
}

下面聲明一委托,該委托有兩個(gè)參數(shù),一個(gè)是參數(shù)代表事件的發(fā)送方,另一個(gè)是參數(shù)是該事件封裝的數(shù)據(jù)。
public delegate void ShapeSizeChanged(objectsender,DrawEventArgs e);
ShapeSizeChanged的實(shí)例可以綁定到任何和它方法簽名匹配的方法上。
下面是自定義事件委托,
public event ShapeSizeChanged SizeChanged;
下面是一個(gè)負(fù)責(zé)引發(fā)事件的類型代碼,
復(fù)制代碼 代碼如下:hl5o.cn

public class DrawManager
{
public event ShapeSizeChangedSizeChanged;
protectedvoid OnSizeChanged(DrawEventArgse)
{
ShapeSizeChangedtemp = SizeChanged;
//是否有委托與該事件關(guān)聯(lián)
if(temp != null)
{
temp(this,e);
}
}
public void SizeChange(doublesize)
{
DrawEventArgse = new DrawEventArgs(size);
OnSizeChanged(e);
}
}


而后定義兩個(gè)監(jiān)聽事件的類型,
復(fù)制代碼 代碼如下:hl5o.cn

public class Square
{
publicSquare(DrawManager drawManager)
{
//drawManager.SizeChanged+= DrawSquare;
//把事件關(guān)聯(lián)到委托上
drawManager.SizeChanged += new ShapeSizeChanged(DrawSquare);
}
public void DrawSquare(objectsender, DrawEventArgs e)
{
Console.WriteLine(string.Format("TheSquare'Length = {0}", e.Size));
}
public void Detach(DrawManagerdrawManager)
{
//drawManager.SizeChanged-= DrawSquare;
//解除事件和委托的關(guān)聯(lián)
drawManager.SizeChanged -= new ShapeSizeChanged(DrawSquare);
}
}
public class Rectangle
{
publicRectangle(DrawManager drawManager)
{
drawManager.SizeChanged +=DrawRectangle;
}
public void DrawRectangle(objectsender, DrawEventArgs e)
{
Console.WriteLine(string.Format("TheRectangle'length={0} and width={1}.",e.Size*2,e.Size));
}
public void Detach(DrawManagerdrawManager)
{
drawManager.SizeChanged -=DrawRectangle;
}
}

測試代碼,
復(fù)制代碼 代碼如下:hl5o.cn

class Program
{
static void Main(string[]args)
{
DrawManagerdrawManager = new DrawManager();
Rectanglerect = new Rectangle(drawManager);
Squaresquare = new Square(drawManager);
//引發(fā)事件
drawManager.SizeChange(5);

//解除監(jiān)聽事件
square.Detach(drawManager);
drawManager.SizeChange(10);
Console.ReadLine();
}
}
/*運(yùn)行結(jié)果
The Rectangle'length=10 and width=5.
The Square'Length = 5
The Rectangle'length=20 and width=10.
*/

.NET中的事件模式和觀察者模式非常相似,也可謂是觀察者模式在.NET下的進(jìn)化版吧,下面用觀察者模式實(shí)現(xiàn)上面功能以做對(duì)比,首先定義兩個(gè)接口,IObserver和IObservable,如下
復(fù)制代碼 代碼如下:hl5o.cn

public interface IObserver
{
voidNotify(DrawEventArgs e);
}
public interface IObservable
{
voidRegister(IObserver observer);
voidUnRegister(IObserver observer);
}

下面是改寫后的兩個(gè)觀察者類,
復(fù)制代碼 代碼如下:hl5o.cn

public class NewRectangle:IObserver
{
privateObserverManager m;
publicNewRectangle(ObserverManager oManager)
{
m=oManager;
oManager.Register(this);
}
public void Notify(DrawEventArgse)
{
Console.WriteLine(string.Format("TheRectangle'length={0} and width={1}.", e.Size * 2, e.Size));
}
public void Detach()
{
m.UnRegister(this);
}
}
public class NewSquare:IObserver
{
privateObserverManager m;

publicNewSquare(ObserverManager oManager)
{
m=oManager;
oManager.Register(this);
}
public void Notify(DrawEventArgse)
{
Console.WriteLine(string.Format("TheSquare'Length = {0}.", e.Size));
}
public void Detach()
{
m.UnRegister(this);
}
}

下面是負(fù)責(zé)通知觀察者的類型,
復(fù)制代碼 代碼如下:hl5o.cn

public class ObserverManager:IObservable
{
protectedArrayList arrList;
publicObserverManager()
{
arrList = newArrayList();
}
public void Register(IObserverobserver)
{
arrList.Add(observer);
}
public void UnRegister(IObserverobserver)
{
if(arrList.Contains(observer))
{
arrList.Remove(observer);
}
}
public void NotifyObservers(doublesize)
{
DrawEventArgse = new DrawEventArgs(size);
foreach(IObserver observer inarrList)
{
observer.Notify(e);
}
}
public void SizeChanged(doublesize)
{
NotifyObservers(size);
}
}

下面是調(diào)用代碼,
復(fù)制代碼 代碼如下:hl5o.cn

static void Main(string[]args)
{
ObserverManageroManager = new ObserverManager();
NewRectanglerect = new NewRectangle(oManager);
NewSquaresquare = new NewSquare(oManager);
oManager.SizeChanged(5);
square.Detach();
oManager.SizeChanged(10);
Console.ReadLine();
}

最好運(yùn)行下代碼,這樣可以更easy的理解這兩種模式微妙的差別了。
對(duì)事件來說,還可以顯式的用add和remove編寫事件訪問器,事件訪問器通常有編譯器生成,所以可以顯式的用事件訪問器修改DrawManager類型,
復(fù)制代碼 代碼如下:hl5o.cn

public class DrawManager
{
privateevent ShapeSizeChangedm_SizeChanged;
privatereadonly objectm_lock = new object();
public event ShapeSizeChangedSizeChanged
{
add
{
lock(m_lock)
{
m_SizeChanged += value;
}
}
remove
{
lock(m_lock)
{
m_SizeChanged -= value;
}
}
}
protectedvoid OnSizeChanged(DrawEventArgse)
{
ShapeSizeChangedtemp = m_SizeChanged;
//是否有委托與該事件關(guān)聯(lián)
if(temp != null)
{
temp(this,e);
}
}
public void SizeChange(doublesize)
{
DrawEventArgse = new DrawEventArgs(size);
OnSizeChanged(e);
}
}

分享:asp.net中Word轉(zhuǎn)Html的辦法(不需要WORD組件)
最近碰到一個(gè)需求,在文本編輯器中實(shí)現(xiàn)“Word導(dǎo)入”功能 發(fā)現(xiàn)了幾種方法,只是作為總結(jié)使用

來源:模板無憂//所屬分類:.Net教程/更新時(shí)間:2013-04-22
相關(guān).Net教程