欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【asp.NET自定义服务器控件内部细节】,下面是详细的分享!
asp.NET自定义服务器控件内部细节
如大家要转载,请保留本人的版权:
关于自定义asp.NET自定义服务器控件文章和源码示例网上已经很多了,不过有些内部些节方面,让一些初次接触这方面技术的朋友难以理解,对服务器控件的方方面面也很疑惑。为此,我抽出些时间把自己所理解的东西整理出来,方便大家交流学习。
一 理解事件委托,事件,引发事件以及事件优化
.NET框架的事件委托和事件数据的命名约定:
事件数据类由事件名加后缀EventArgs构成,如:SXLoginEventArgs
事件委托由事件名加后缀EventHandler构成,如:SXLoginEventHandler
引发事件的方法名字是在事件前加上前缀On,OnSXLogin
1。事件委托
委托其实是一个类,委托具有函数指针的粒度和接口的安全性,为什么这样说,是因为委托就是安全类型的函数指针,用来回调方法,方法的签名必须和委托的签名相匹配。
下面我们看看委托的声名:
public delegate void SXLoginEventHandler(object sender,SXLoginEventArgs e);
上面的定义表示定义了一个SXLoginEventHandler的事件委托,返回类型是void,并分别接受一个object和SXLoginEventArgs类型的参数。object表示事件的发送者,e表示描述事件的数据。
可以看出事件委托的声名和类的声名是类似的,只需增加关键字delegate即可。
委托间接派生于System.Delegate,直接派生于System.MulticastDelegate。
2。事件
事件是当有动作发生或状态改变时,类发出的信息或通知。
下面我们看看事件的声名:
public event SXLoginEventHandler SXLogin ;可以看出事件是与一个委托相关联的。
3。引发事件
为了在类中实现事件,需要一个事件数据类,事件委托以及一个发布事件通知的方法。我们需要把这些组合在一起,下面给一个例子:
3.1 如果类没有任何关联的事件数据,就直接使用EventArgs类,或其它已存在的事件数据类,必须匹配。否则,需要定义一个事件数据类,这个类必须从System.EventArgs中派生,如下:
public class SXLoginEventArgs:EventArgs{...}
3.2 如果事件没有关联的数据,就直接使用System.EventHandler作为事件委托,否则,需要定一个事件委托,如下:
public delegate void SXLoginEventHandler(object sender , SXLoginEventArgs e );
3.3 用event关键字定义事件成员,后面紧跟与此对应的事件委托,如下:
public event SXLoginEventHandler SXLogin ;
3.4 在类中定义一个虚方法调用事件委托,方法的名字是在事件前加上前缀On,如下:
protected virtual void OnSXLogin(SXLoginEventArgs e)
{
if(SXLogin !=null)
{
SXLogin(this , e);
}
}
4。事件优化
如果一个类中引发了多个事件,通过为每一个事件声名一个事件字段成员来执行时低效的,为此我们换一种方法用属性来定义事件。
.NET框架有一个System.ComponentModel.EventHanlderList类,这个类是一个优化了的委托存储和取回的链表。下面来看看优化事件模式是如何实现的:
private EventHanlderList events ;
protected EventHanlderList Events
{
get
{
if(events==null)
{
events=new EventHanlderList();
}
return events;
}
}
protected static readonly object SXLoginEventObject=new object();
我们用属性而不是字段来定义事件,如下:
public event SXLoginEventHandler SXLogin
{
add{Events.AddHandler(SXLoginEventObject,value)};
remove{Events.RemoveHandler(SXLoginEventObject,value)};
}
以上所分享的是关于asp.NET自定义服务器控件内部细节,下面是编辑为你推荐的有价值的用户互动:
相关问题:asp.net 自定义控件,我想获取它的内部html内容,...
答:自己设一个是否隐藏的属性,然后在控件上设置这个属性就可以了 >>详细
相关问题:设置自定义ASP.NET服务器控件TagPrefix的几种方法...
答:1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Text;5usingSystem.Web;6usingSystem.Web.UI;7usingSystem.Web.UI.WebControls;89namespaceServerControl10{11[ToolboxData(" >>详细
相关问题:求助,asp自定义控件asp.net ajax服务器控件,WebC...
答:一般都使用jQuery的ajax直接使用,如果确实要使用服务器控件,你可以直接使用.NET自带的AJAX Extension中的ScriptManager和UpdatePanel >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
