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

ASP.NET
Asp.net利用JQuery弹出层加载数据代码
asp.net dataview做无限极分类的又一用法
asp.net ckeditor编辑器的使用方法
告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)
asp.net 实现动态显示当前时间(不用javascript不考虑开销)
.net动态显示当前时间(客户端javascript)
asp.net 结合YUI 3.0小示例
asp.net 取消缓存相关问题说明
asp.net 计划任务管理程序实现,多线程任务加载
ASP.NET 跨页面传值方法
asp.net中url地址传送中文参数时的两种解决方案
Asp.net 菜单控件简洁版
asp.net jQuery Ajax用户登录功能的实现
asp.net SharpZipLib的压缩与解压问题
asp.net url重写后页面回传问题
asp.net与Discuz!NT整合集成实例教程
Discuz!NT 3与asp.net 整合的实例教程
测试控制台使用方法
.net 动态标题实现方法
asp.net *.ashx类型的文件使用说明

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 84 ::
收藏到网摘: 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)};
 }