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

如大家要转载,请保留本人的版权:
/*
*Description:asp.NET自定义服务器控件内部细节系列教程
*Auther:崇崇-天真的好蓝
*MSN:chongchong2008@msn.com
*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)};
 }

时间: 2024-10-30 18:58:33

asp.NET自定义服务器控件内部细节的相关文章

asp.net 自定义服务器控件权威资料

最近公司安排做一个自定义的可重用的控件 ,一直搞c/s 的,突然让我搞 b/s 还真有点不习惯,搁置了2年的web思想早已经陈旧了,要恶补一下了.asp.net 服务器控件最权威的资料 MSDN: 演练:开发和使用自定义服务器控件http://msdn.microsoft.com/zh-cn/library/yhzc935f.aspx 演练:为 Web 服务器控件创建基本控件设计器http://msdn.microsoft.com/zh-cn/library/12yydcke.aspx ASP.

ASP.net自定义服务器控件之GridViewControl

根据项目需要,提供自定义服务器控件之 GridViewControl,提供数据为空时的自定义显示. [DefaultProperty("EnableEmptyContentRender")] [ToolboxData("<{0}:GridViewControl runat=server></{0}:GridViewControl>")] public class GridViewControl : System.Web.UI.WebContr

ASP.net自定义服务器控件TextBox

基于项目需要,针对ASP.net服务器控件TextBox进行改造,使其增加字符串输入提示功能,在控件获得焦点时,与普通的服务器端 TextBox 控件相同,支持数据输入.当控件失去焦点并且文本框内容为空时,显示预定义的提示文本.用户输入"预定义的提示文本"为文本内容时, 默认文本框Text值为空字符串. [DefaultProperty("Text")] [ToolboxData("<{0}:TextBox runat=server></

ASP.NET2.0服务器控件之自定义状态管理

asp.net|服务器|控件 在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性.本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法. 自定义视图状态管理 在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String.Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能.然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化

ASP.NET2.0服务器控件之自定义状态管理_实用技巧

     在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性.本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法. 自定义视图状态管理 在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String.Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能.然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化视图状态管理时,则必

ASP.NET2.0服务器控件之创建复杂属性

asp.net|创建|服务器|控件 上一篇文章介绍了实现3种形式复杂属性的具体方法.为了加深读者对于这些实现方法的理解深度,本文详细讲解了一个利用ASP.NET 2.0技术创建复杂属性的示例. 1. 示例应用 本文所实现的示例很简单,其核心是通过实现自定义服务器控件的连字符形式复杂属性来说明复杂属性的实现方法,其中使用了上一篇文章中介绍的内容.示例效果图如图1所示. 图1 如图1所示,页面显示了公司所在城市.姓名.性别和职务信息.这些内容是定义服务器控件呈现的结果,其中公司所在城市由简单属性Ci

ASP.NET2.0服务器控件之类型化样式属性

asp.net|服务器|控件 上一篇文章对控件样式属性的基本概念进行了介绍,同时,还通过示例说明了重写样式属性的方法.本文重点对类型化样式属性的创建方法进行讲解. 实现类型化样式属性的方法 继承自Style类的类称为类型化样式.Style类可以由控件开发人员来扩展,创建一个自定义类型化样式,它重写或者添加Style类的属性.服务器控件也可以把自定义类型化样式作为ControlStyle属性的类型.例如,Table控件的ControlStyle属性就是TableStyle类型,该类型是扩展的Sty

ASP.NET2.0服务器控件之创建自定义控件

asp.net|创建|服务器|控件 摘要 本文将详细讲解一个简单的自定义服务器控件的创建过程.通过这些内容,读者将了解利用Visual Studio 2005,创建和测试自定义服务器控件的基本方法. 注意:本文内容基于ASP.NET 2.0技术撰写,示例应用程序使用Visual Studio 2005进行开发. 创建一个简单的自定义服务器控件 创建自定义服务器控件的过程包括: (1)创建一个测试用Web站点应用程序: (2)为新建站点应用程序,新增一个Web控件库项目: (3)编写.编译和测试自

ASP.NET2.0服务器控件之Render方法

asp.net|服务器|控件 控件呈现是指向HTTP输出流中写入标记文本的过程.服务器通过HTTP输出流向客户端发送生成的标记文本,这些文本将会通过客户端浏览器转换为可视化的元素显示出来.使用控件呈现,开发人员可以将HTML标记.脚本代码.CSS样式表等等输入到客户端浏览器.实现服务器控件呈现主要有两种方式:一是Control类的Render方法,二是WebControl的RenderContents方法.本文重点介绍使用Control类的Render方法实现控件呈现的应用. 使用HtmlTex