在之前讲的几个例子中,使用的是最普通的定义事件方法,比如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控件和组件开发技术》笔记:高效率事件集合对象相关推荐

  1. 英文版资料[庖丁解牛—纵向切入Asp.net 3.5控件和组件开发技术]

    英文版资料[庖丁解牛-纵向切入Asp.net 3.5控件和组件开发技术] . Carving Up an Ox * Book Name <Carving Up an Ox: In-depth A ...

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

    今天看到一本电子书,郑健写的,关于控件和组件开发技术的,总体还不错,推荐给大家看看. 本书详细信息 前言与目录 庖丁解牛 前言 庖丁解牛 目录 序 庖丁解牛 序一 庖丁解牛 序二 第2章 服务器控件开 ...

  3. ★★★【庖丁解牛:纵向切入Asp.net 3.5控件和组件开发技术系列—(1)读者序】★★★...

    本书主要内容 大部分开发人员在学习Asp.net的过程中都有这样的体会,使用Asp.net开发很多年,但仍然感觉对Asp.net技术的了解比较少,对知识点的了解比较模糊:以及,在工作过程中经常接到克刻 ...

  4. 庖丁解牛ASP.NET3.5控件和组件开发技术-(1)服务器控件概述

    服务器控件概述 1.服务器控件的类型以及ASP.NET控件开发的系统基类 Control,WebControl,CompositeControl,DataBoundControl,Hierarchic ...

  5. AndroidStudio安卓原生开发_UI控件_ImageView_CheckBox_RadioButton---Android原生开发工作笔记98

    ImageView是个图片控件,但实际上,任何drawable对象都可以使用imageView来显示. scaleType的详细: 这些可以了解,这样可以方便的设置图片的位置

  6. AndroidStudio安卓原生开发_UI控件_TextView_Button_EditText---Android原生开发工作笔记97

    这个Textview控件是button的父类,EditText也是这个要知道 2.可以看到上面的继承关系图

  7. AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120

    然后我们再来看一个UI控件,侧滑菜单. 上面是文字描述,我们去做一下. 我们到activity_main.xml中去 我们先去写第一个子view,是内容显示区域.就是用来显示我们 侧滑菜单的区域 然后 ...

  8. AndroidStudio安卓原生开发_SwipeRefreshLayout_下拉刷新控件---Android原生开发工作笔记119

    然后我们再来看一个SwipeRefreshLayout,这个是用来实现下拉刷新的一个UI控件. 注意这个SwipeRefreshLayout里面只能放一个子view,一般都是放一个listview.来 ...

  9. AndroidStudio安卓原生开发_UI控件_SeekBar_ProgressBar_DataPicker---Android原生开发工作笔记99

    我们再去看这个seekbar 去写一下 看看效果

最新文章

  1. 2014年最值得关注的六大趋势
  2. [原]全桥移相(PSFB)原边电流突跌分析
  3. apache个人主页搭建
  4. 【jzoj】2018.2.7NOIP普及组——某【BC】组模拟赛
  5. HP 1218 无线设置
  6. FCKeditor配置和使用(转)
  7. 520 简单表白代码(JS)
  8. linux samba
  9. pythonfor循环是迭代器吗_Python学习——for循环,生成器,迭代器详解
  10. 西门子s7-200smart——2.cpu选型
  11. 即时聊天工具国外盛行,国内发展缓慢
  12. 企企通SRM:时尚服装品牌企业建立优质供应链体系,只需要做到这几步
  13. CVBS视频信号解析
  14. 【Proteus仿真】Arduino UNO +WS2812玩转霓虹灯
  15. 基于Dx11写一个自己的游戏引擎--1
  16. 计算机表格怎么添加单下划线,如何在excel表格中添加并设置下划线
  17. UltraCompare Crack,重复文件查找器
  18. 隔离DCDC电源模块和非隔离DCDC电源模块不同之处
  19. 【Python实用工具】暴力破解-1!Python编写四位数密码本
  20. ubuntu18.04右键添加新建空白文本文件

热门文章

  1. redhat9安装mysql_redhat 9.0 安装mysql
  2. frm考试可以用计算机,FRM考试,考生自己可以携带计算器吗?
  3. Linux能适应不同的指令集,(转)linux常用指令集
  4. 等待读取完毕 java_java – 等待来自客户端读取消息的套接字服务器
  5. .net core高并发_高并发下的Node.js与负载均衡
  6. Java捕获异常密码_Java捕获异常的问题
  7. ios时间相差多少天_iOS 计算某个时间到现在是多少月/天/时
  8. vsftp日志查看_vsftp日志xferlog格式分析(示例代码)
  9. pyqt生成 android,PyQt on Android
  10. buck电路上下管_推荐 | 学好电路设计与仿真?你不能错过这两本书籍 ~