关闭顶部展开顶部

.NET图像界面按钮的clicked事件浅谈_.Net教程

编辑Tag赚U币

推荐:Asp.net中使用PageDataSource分页实现代码
这篇文章主要介绍asp.net中使用PageDataSource分页的方法,需要的朋友可以参考下

但是事件并不局限于图像界面,也可能是满足程序的某个逻辑判断触发了事件。引发事件的对象叫做事件发送方,捕获事件并对其做出响应的对象叫做事件接收方。但是事件发送方并不知道哪个对象或者方法会处理它引发的事件,所以需要在事件发送方和事件接收方之间存在一媒介,明确某个对象或者某个类型的某个方法会对这个事件进行响应。.NET用委托作为事件发送方与事件接收方之间的媒介,委托只有一个签名,只要方法签名与委托签名匹配的方法,都可以声明自己对这个委托类型的事件的感兴趣,接收并处理它。
事件发送方的对象为了给事件接收对象传递一些额外信息,就需要写一个派生于System.EventArgs的类,封装一些数据。

复制代码 代码如下:www.mb5u.com

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

下面声明一委托,该委托有两个参数,一个是参数代表事件的发送方,另一个是参数是该事件封装的数据。
public delegate void ShapeSizeChanged(objectsender,DrawEventArgs e);
ShapeSizeChanged的实例可以绑定到任何和它方法签名匹配的方法上。
下面是自定义事件委托,
public event ShapeSizeChanged SizeChanged;
下面是一个负责引发事件的类型代码,
复制代码 代码如下:www.mb5u.com

public class DrawManager
{
public event ShapeSizeChangedSizeChanged;
protectedvoid OnSizeChanged(DrawEventArgse)
{
ShapeSizeChangedtemp = SizeChanged;
//是否有委托与该事件关联
if(temp != null)
{
temp(this,e);
}
}
public void SizeChange(doublesize)
{
DrawEventArgse = new DrawEventArgs(size);
OnSizeChanged(e);
}
}


而后定义两个监听事件的类型,
复制代码 代码如下:www.mb5u.com

public class Square
{
publicSquare(DrawManager drawManager)
{
//drawManager.SizeChanged+= DrawSquare;
//把事件关联到委托上
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;
//解除事件和委托的关联
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;
}
}

测试代码,
复制代码 代码如下:www.mb5u.com

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

//解除监听事件
square.Detach(drawManager);
drawManager.SizeChange(10);
Console.ReadLine();
}
}
/*运行结果
The Rectangle'length=10 and width=5.
The Square'Length = 5
The Rectangle'length=20 and width=10.
*/

.NET中的事件模式和观察者模式非常相似,也可谓是观察者模式在.NET下的进化版吧,下面用观察者模式实现上面功能以做对比,首先定义两个接口,IObserver和IObservable,如下
复制代码 代码如下:www.mb5u.com

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

下面是改写后的两个观察者类,
复制代码 代码如下:www.mb5u.com

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);
}
}

下面是负责通知观察者的类型,
复制代码 代码如下:www.mb5u.com

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);
}
}

下面是调用代码,
复制代码 代码如下:www.mb5u.com

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();
}

最好运行下代码,这样可以更easy的理解这两种模式微妙的差别了。
对事件来说,还可以显式的用add和remove编写事件访问器,事件访问器通常有编译器生成,所以可以显式的用事件访问器修改DrawManager类型,
复制代码 代码如下:www.mb5u.com

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;
//是否有委托与该事件关联
if(temp != null)
{
temp(this,e);
}
}
public void SizeChange(doublesize)
{
DrawEventArgse = new DrawEventArgs(size);
OnSizeChanged(e);
}
}

分享:asp.net中Word转Html的办法(不需要WORD组件)
最近碰到一个需求,在文本编辑器中实现“Word导入”功能 发现了几种方法,只是作为总结使用

来源:模板无忧//所属分类:.Net教程/更新时间:2013-04-22
相关.Net教程
闂佹眹鍩勯崹閬嶆偤閺囶澁缍栭柛鈩冪⊕閳锋帗銇勯弴妤€浜惧銈忕秶閹凤拷
濠电偛顕慨顓㈠磻閹炬枼妲堥柡鍌濇硶婢ф稒淇婇懠顒夆偓婵嬫煟閵忊晛鐏查柟鍑ゆ嫹
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径瀣閻庣懓瀚竟鍡欐崲娑斾線鏌i姀鈺佺伈闁瑰嚖鎷�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径濠勵吋闂佽鍨庨崟顓фК闂佽閰eḿ褍螞濞戙垺鍋夐柨鐕傛嫹
闂備胶枪缁绘劙骞婃惔銊ョ劦妞ゆ帒鍊哥敮鍫曞箹鐎涙ḿ鐭掔€规洘绻堥弫鎾绘晸閿燂拷
闂備胶枪缁绘劙骞婃惔銊ョ劦妞ゆ巻鍋撻柛姘儑缁﹪鏁傞崜褏鐓撻柣搴岛閺呮繈鎯屽▎鎴犵=濞撴艾锕ョ€氾拷
闂備浇銆€閸嬫挻銇勯弽銊р槈闁伙富鍣i弻娑樷攽閹邦亞鑳虹紓浣靛妽濡炶棄顕i妸鈺婃晬婵炲棙鍨电粭锟犳⒑閸濆嫬鈧骞婇幘鑸殿潟闁跨噦鎷�
闂備礁鎼崯鐗堟叏妞嬪海绀婂鑸靛姈閻擄綁鎮规潪鎷岊劅婵炲眰鍊曢湁闁挎繂妫欑粈鈧梺鍛娚戦悧鐘茬暦閹扮増鏅搁柨鐕傛嫹
婵犵妲呴崹顏堝礈濠靛棭鐔嗘俊顖氬悑鐎氱粯銇勯幘瀵哥畺閻庢熬鎷�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓奸崶銊ヮ伕濡炪倖鎸荤换鍐偓姘虫珪娣囧﹪顢涘Δ鈧晶鍙夌節椤喗瀚�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎规洦鍓熼、娆撳礂閻撳簶鍋撻悽鍛婄厸闁割偅绻勫瓭婵犳鍣幏锟�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾闁哄苯鎳橀崺鈧い鎺嗗亾闁宠閰i獮鎴﹀箛闂堟稒顔嗛梻浣告惈鐎氭悂骞忛敓锟�
婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎规洩缍侀獮瀣攽閸偂绱�
濠电姷顣介埀顒€鍟块埀顒勵棑缁辩偛顓兼径濠勭厬闂佺懓鐡ㄧ换鍕敂鐎涙ü绻嗘い鏍殔婢у弶绻濋~顔藉
闂佽楠搁崢婊堝礈濠靛鍋嬮柟鎯版閻鈹戦悩鎻掓殭闁奸潧缍婇弻銈夋嚍閵夈儱顫嶉梺缁樼壄缂嶄礁鐣峰▎鎾存櫢闁跨噦鎷�
UB闂備礁婀辩划顖炲礉濡ゅ懐宓侀柛銉㈡櫆鐎氭岸鎮楀☉娅虫垿锝為敓锟�
闂備浇澹堟ご绋款潖婵犳碍鐒鹃悗鐢电《閸嬫捇鐛崹顔句痪濠电姭鍋撻柨鐕傛嫹
闂佽楠哥粻宥夊垂閸濆嫸鑰块柛銏㈠殰
闂備礁鎲″缁樻叏妞嬪海绀婂璺虹灱閸楁碍绻涢崱妤€顒㈤柛鐐差槹缁绘稓绱欓悩鍝勫帯闂佺ǹ楠忛幏锟�
缂傚倸鍊烽悞锕傛偡閿曞倸鍨傛繝濠傚椤╅攱銇勯幒宥囶槮缂佹彃婀遍埀顒傚仯閸婃繄绱撳棰濇晩闁跨噦鎷�
©2017 www.mb5u.com婵犵妲呴崹顏堝礈濠靛棭鐔嗘慨妞诲亾鐎殿噮鍣i幃鈺呭箵閹烘挸鐦�
闂備浇銆€閸嬫捇鏌熼婊冾暭妞ゃ儻鎷�&闂備礁鎲$敮鎺懳涢弮鍫燁棅闁跨噦鎷�