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功能完全相同,应用方法也相同。另外,事件的委托和参数对象也可以自定义,下一节就讲一下如何定制自己的委托和事件对象。

  • 相关阅读:
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Path Sum
    Symmetric Tree
    Solve Tree Problems Recursively
    632. Smallest Range(priority_queue)
    609. Find Duplicate File in System
    poj3159最短路spfa+邻接表
  • 原文地址:https://www.cnblogs.com/ranzige/p/3924426.html
Copyright © 2011-2022 走看看