日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象

發布時間:2025/3/8 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《纵向切入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控件和组件开发技术》笔记:高效率事件集合对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。