当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.NET自定义服务器控件内部细节

ASP.NET
二级域名Cookie问题的解决方法
如何为asp.net网站项目添加子项目
asp.net用url重写URLReWriter实现任意二级域名
asp.net 序列化and反序列化演示
asp.net Timer的使用方法
AjaxControlToolKit DropDownExtender(下拉扩展控件)使用方法
AjaxControlToolKit CalendarExtender(日历扩展控件)的使用方法
让GridView只显示特定用户的数据的方法
让GridView只更新某些特定的数据的方法
ajaxControlToolkit中CascadingDropDown的用法说明
axp.net ScriptManager的简单用法
把程序集安装到全局程序集缓存中的步骤
引用全局程序集缓存内的程序集的方法
asp.net COOKIES需要注意的一点
asp.net UrlReWriter使用经验小结
页面导出为Excel的时间格式的问题
asp.net cookie清除的代码
Asp.net XMLHTTP封装类(GET,Post发送和接收数据)
ASP.NET XmlHttp跨域访问实现代码
Asp.NET 随机码生成基类(随机字母,随机数字,随机字母+数字)

ASP.NET 中的 asp.NET自定义服务器控件内部细节


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 221 ::
收藏到网摘: n/a

如大家要转载,请保留本人的版权:
/*
*Description:asp.NET自定义服务器控件内部细节系列教程
*Auther:崇崇-天真的好蓝
*MSN:[email protected]
*Dates:2007-05-20
*Copyright:ChongChong2008 YiChang HuBei China
*/

关于自定义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)};
 }