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

ASP.NET
Asp.net 时间操作基类(支持短日期,长日期,时间差)
asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)
asp.net 数据库备份还原(sqlserver+access)
Asp.Net 数据操作类(附通用数据基类)
Asp.net 弹出对话框基类(输出alet警告框)
Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)
Asp.net Socket客户端(远程发送和接收数据)
Asp.net 字符串操作基类(安全,替换,分解等)
Asp.Net数据输出到EXCEL表格中
asp.net Gridview里添加汇总行
asp.net UpdatePanel的简单用法
asp.net ajaxControlToolkit FilteredTextBoxExtender的简单用法
this connector is disabled错误的解决方法
sql事务应用积累
asp.net Page.Controls对象(找到所有服务器控件)
在asp.NET中字符串替换的五种方法
ASP.NET缓存方法分析和实践示例代码
asp.net 在DNN模块开发中遇到的resx怪问题
ASP.NET State service状态服务的问题解决方法
asp.net 结合mysql存储过程进行分页代码

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


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