国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

《縱向切入ASP.NET3.5控件和組件開發技術》筆記:高效率事件集合對象

2019-11-14 16:29:19
字體:
來源:轉載
供稿:網友

  在之前講的幾個例子中,使用的是最普通的定義事件方法,比如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功能完全相同,應用方法也相同。另外,事件的委托和參數對象也可以自定義,下一節就講一下如何定制自己的委托和事件對象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 林口县| 秦安县| 高阳县| 陇西县| 宜阳县| 东台市| 靖安县| 尚义县| 邓州市| 南乐县| 长汀县| 铜山县| 池州市| 八宿县| 武功县| 赤峰市| 修文县| 永新县| 张掖市| SHOW| 广昌县| 铜川市| 本溪市| 奇台县| 辽阳县| 阳西县| 饶平县| 西林县| 东安县| 南澳县| 沈丘县| 鄱阳县| 右玉县| 蕲春县| 慈溪市| 蓝山县| 南昌县| 奉新县| 文水县| 杭锦旗| 纳雍县|