zoukankan      html  css  js  c++  java
  • 《纵向切入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功能完全相同,应用方法也相同。另外,事件的委托和参数对象也可以自定义,下一节就讲一下如何定制自己的委托和事件对象。

  • 相关阅读:
    Python3之命令行参数处理
    基于 Laradock 环境 Project 的总结
    Typora功能新发现-自动复制图片到指定目录下
    ubuntu 18.04 设置静态ip方法
    vscode 同时编辑多处,多个光标 快捷键
    nginx和ftp搭建图片服务器
    Centos 6.5出现yum安装慢的情况
    Linux中的CentOS 6克隆之后修改
    springMVC-文件上传CommonsMultipartFile
    Spring和mybatis整合 org.mybatis.spring.mapper.MapperScannerConfigurer
  • 原文地址:https://www.cnblogs.com/ranzige/p/3924426.html
Copyright © 2011-2022 走看看