快速业务通道

庖丁解牛Asp.net3.5控件和组件开发技术系列—事件和数据回发机制(二)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
TextBoxCanPostEvent,则__LASTFOCUS 隐藏控件域是共用的。

这一节内容就讲这么多。本节涉及一些客户端操作,包括控件开发Page类对脚本开发的支持。这里仅作了解即可,脚本开发在控件开发中远不只这些,后面还有专门的章节介绍。

5.3 复合控件的事件处理机制

复合控件处理起来比前面几节讲的原始控件(非复合控件)要简单,比较容易理解。

5.3.1 高效率事件集合对象

在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public event EventHandler TextChanged;
protected virtual void OnTextChanged(EventArgs e)
{
   if (TextChanged != null)
   {
     TextChanged(this, e);
   }
}

在复合控件中,事件一般比较多,如果仍然基于以上普通事件的实现方法来定义事件,就会定义许多事件委托实现对象,导致占用较多内存存储。

在这种情况下,则应该通过System.ComponentModel.EventHandlerList集合类来保存事件,原因是使用此类在多个事件的声明过程中比普通的实现方法效率高。EventHandlerList类提供一个简单的委托列表来添加(Events.AddHandler)和删除(Events.RemoveHandler)委托,在Control基类中已经定义好了EventHandlerList类型的对象Events,因此可以直接通过base.Events访问事件列表对象。

下面利用Events集合对象存储事件,修改一下KingTextBox控件的事件声明/调用部分,为了保留KingTextBox现有功能,新增一个控件示例,控件名称为KingTextBoxUseEvents。事件部分的代码为:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>

private static readonly object TextChangedKeyObject = new object();
public event EventHandler TextChanged
{
   add
   {
     base.Events.AddHandler(KingTextBoxUseEvents.TextChangedKeyObject, value);
   }
   remove
   {
     base.Events.RemoveHandler(KingTextBoxUseEvents.TextChangedKeyObject,
     value);
   }
}
protected virtual void OnTextChanged(EventArgs e)
{
   EventHandler handler = base.Events[KingTextBoxUseEvents.TextChanged
   KeyObject] as EventHandler;
   if (handler != null)
   {
     handler(this, e);
   }
}

以上代码首先定义了一个Object对象TextChangedKeyObject,用于当存储事件到Events列表时,作为 TextChanged事件的Key,其对应Value为即为事件方法体。接下来定义了一个事件委托类型的TextChanged属性,其内容包括一个 add和一个remove子句,在这两个子句中分别完成注册和释放事件功能。最后的OnTextChanged方法也稍微变了一下,增加了从 base.Events事件列表中根据TextChangedKeyObject键得到事件句柄的代码语句,如果取得的句柄handler不为null,即可引发开发人员注册的事件。

控件KingTextBoxUseEvents代码也比较简单,下面也把它的完整代码展示出来:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
[DefaultProperty("Text")]
[ToolboxData("<{0}:KingTextBoxUseEvents runat=server></{0}:KingTextBoxUseEvents>")]
public class KingTextBoxUseEvents : Control, IPostBackDataHandler
{
 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号