`
cloudtech
  • 浏览: 4612742 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

高效率事件集合对象

 
阅读更多

高效率事件集合对象

本文节选自《庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术》一书

在之前讲的几个例子中,使用的是最普通的定义事件方法,比如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
{
public KingTextBoxUseEvents()
{
}

/// <summary>
/// 设置或获取显示文本
/// </summary>
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}

set
{
ViewState["Text"] = value;
}
}

/// <summary>
/// 生成呈现HTML格式标记
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
sb.Append("<input type=/"text/" name=");
sb.Append("/"" + UniqueID + "/"");
sb.Append(" value=");
sb.Append("/"" + HttpUtility.HtmlEncode(Text) + "/"");
sb.Append(" />");
writer.Write(sb.ToString());
}

public virtual bool LoadPostData(string postDataKey, NameValueCollection
postCollection)
{
string strOldValue = Text;
string strNewValue = postCollection[this.UniqueID];
if( strOldValue == null || ( strOldValue != null && !strOldValue.Equals
(strNewValue)))
{
this.Text = strNewValue;
return true;
}
return false;
}


public virtual void RaisePostDataChangedEvent()
{
OnTextChanged(EventArgs.Empty);
}

//高效事件
private static readonly object TextChangedKeyObject = new object();
public event EventHandler TextChanged
{
add
{
base.Events.AddHandler(KingTextBoxUseEvents.TextChangedKeyObject, value);
}
remove
{
base.Events.RemoveHandler(KingTextBoxUseEvents.TextChanged
KeyObject, value);
}
}
protected virtual void OnTextChanged(EventArgs e)
{
EventHandler handler =base.Events[KingTextBoxUseEvents.TextChanged KeyObject] as EventHandler;
if (handler != null)
{
handler(this, e);
}
}
}
KingTextBoxUseEvents控件与KingTextBox功能完全相同,应用方法也相同。另外,事件的委托和参数对象也可以自定义,下一节就讲一下如何定制自己的委托和事件对象。

分享到:
评论

相关推荐

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    5.3.1 高效率事件集合对象 168 5.3.2 定制自己的委托和事件参数类 170 5.3.3 复合控件的事件处理 175 5.3.4 自动完成功能控件searchcontrolintelligent 185 5.4 本章总结 193 第6章 页面状态机制 194 6.1 页面...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    5.3.1 高效率事件集合对象 168 5.3.2 定制自己的委托和事件参数类 170 5.3.3 复合控件的事件处理 175 5.3.4 自动完成功能控件searchcontrolintelligent 185 5.4 本章总结 193 第6章 页面状态机制 194 6.1 页面...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    5.3.1 高效率事件集合对象 168 5.3.2 定制自己的委托和事件参数类 170 5.3.3 复合控件的事件处理 175 5.3.4 自动完成功能控件searchcontrolintelligent 185 5.4 本章总结 193 第6章 页面状态机制 194 6.1 页面...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

    5.3.1 高效率事件集合对象168 5.3.2 定制自己的委托和事件参数类170 5.3.3 复合控件的事件处理175 5.3.4 自动完成功能控件searchcontrolintelligent185 5.4 本章总结193 第6章 页面状态机制194 6.1 页面状态...

    list去掉重复对象

    一个list里面有多个对象,对象有几个字段,要求在对象里面不要有重复的数据的实现。

    求2个集合的交集

    hash的另一个特点是查找效率为O(1),惊人的高! 对于这道题目要是算出来O(M*N)的同学就应该补课了。出来混,迟早要还的。 HashSet类 HashSet类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集...

    JSON 与对象、集合之间的转换的示例

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON作为一个轻量级的数据格式比xml效率要高,本篇文章主要介绍了JSON 与 对象 、集合 之间的转换,有兴趣的可以了解一下。

    完成Java面向对象程序设计实验课的心得体会.doc

    面向对象的编程 思想就要想近世代数的分析思想,首先要确定"论域〞,即工程所涉与到的所有的"对象 〞,然后要分类处理,把隶属同一类别的对象集合在一起〔做成一个集合〕,定义他们 之间的运算性质与可以进行的操作...

    JavaScript王者归来part.1 总数2

     7.5.5 特殊的对象--全局对象与调用对象   7.6 总结   第8章 集合  8.1 数组和数组元素   8.1.1 数组的构造   8.1.2 数组常量   8.1.3 数组元素   8.2 数组对象和方法   8.2.1 查找元素   8.2.2 ...

    cqengine:对Java集合的超快速类似SQL的查询

    CQEngine-集合查询引擎CQEngine –集合查询引擎–是一种高性能的Java集合,可以通过类似SQL的查询进行搜索,并且延迟极短。 每秒完成数百万个查询,查询延迟以微秒为单位从数据库卸载查询流量-扩展您的应用程序层...

    仓库管理系统 (系统+文档)

    本系统采用的是微软公司的Microsoft Visual C++ 6.0企业版开发工具做为开发系统程序,采用两层体系架构模型即界面层、数据访问层。采用C/S两层体系架构...以及三个集合对象:Errors、Parameters与Fields对象所组成。

    C++ 面向对象教程 21 courses#

    1.2.3 运行效率 4 1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 ...

    超级有影响力霸气的Java面试题大全文档

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...

    java学习3.zip

    Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新...

    java基础学习+java

    Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新...

    java学习2.zip

    Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新...

    EXCEL数据高级查询

    EXCEL数据高级查询摘要 EXCEL 对批量数据的多次重复或相似的统计和交叉性集合运算操作比较困难或效率不高 而使用 Visual Basic 开发平台利用ADO 数据库连接和操作技术可以很好的解决这样的问题 提高 EXCEL 文件数据...

    数据结构总结.doc

    第1章 绪论 ...2.好的算法目标:正确性、可读性、健壮性、高效率与低存储量 1.2.2 算法效率的度量 1.时间复杂度: ,通常指最坏情况下时间复杂度 2.空间复杂度:原地工作指算法所需的辅助空间是常量

    论文研究-基于用户相似性的加权SlopeOne算法.pdf

    针对因Slope One算法没有考虑相似性,而导致个性化推荐准确率不高的问题,提出了一种基于用户相似性的加权Slope One算法(BUS weighted Slope One算法)。通过先评定用户活跃度,筛选出活跃用户,然后依据项目间相似...

    Java集合框架和泛型机制

     JDK API中专门设计用来存储其他对象的类,一般称为对象容器类,简称容器类,这组类和接口的设计结构也被统称为集合框架(Collection Framework)。集合框架中容器类的关系如下图示  主要从两方面来选择容器...

Global site tag (gtag.js) - Google Analytics