【原創】ASP.NET自訂控制項開發點滴(二)

來源:互聯網
上載者:User

 出處:http://blog.csdn.net/caoxicao
 作者:草惜草
 轉載請註明出處

HtmlTextWriter

HtmlTextWriter的各種方法的參數取值為以下三種枚舉類型:HtmlTextWriterTag,HtmlTextWriterAttribute和HtmlTextWriterStyle。這些枚舉列舉了HTML4.0的公用簽名、attribute和CSS樣式attribute。HtmlTextWriter中的很多方法都被重載,可以將字串或者枚舉值作為一個參數傳送過去。

-----------------------------------------
委託和事件
我一直深受C#中委託和事件的影響,認為委託就是Delegate,事件是Event.哈哈,原來ASP.NET
中EventHandler就是所謂的委託。狂暈!

.NET Framework 中的事件模型基於具有事件委託,該委託將事件與事件處理常式串連。引發事件需要兩個元素:
儲存事件數目據的類。該類必須從基類 EventArgs 派生。
指向方法的委託,該方法提供對事件的響應。
如果事件不產生資料,則使用事件數目據對象的基類 EventArgs 和事件委託的預定義 EventHandler。

如: public delegate void EventHandler(Object sender, EventArgs e);

 這是一個對不包含資料事件委託的聲明,其中 EventHandler 是預定義的事件委託,sender 是引發事件的對象,而 e 是不包含資料的事件數目據對象,EventArgs 是包含事件數目據的類的基類。

----------------------------------------------

複合控制項

EnsureChildControls() 方法是確認當前控制項存在子控制項。如果沒有就建立一個。
複合控制項可選擇是否將子控制項公開為屬性,以及將子控制項的哪些屬性和事件公開為頂級屬性和事件。
如下所示就是將button子控制項的Text屬性公開為ButtonText屬性。

        public string ButtonText {
            get {
                EnsureChildControls();
                return _button.Text;
            }
            set {
                EnsureChildControls();
                _button.Text = value;
            }
        }

-----------------------------------------
關於事件最佳化 

C#提供了“屬性樣式的事件聲明”
基本格式為:
        public event [委託類型] [事件名稱]
        {
            add { .... }
            remove { .... }
        }

利用這個被稱為“事件模型”的東西來建立事件委託。Control類為每個事件定義了一個,用於EventHandler中儲存和取回事件委託。
例如下面的代碼顯示了Logon事件的。  
   
private static readonly object EventLogon = new object();

是靜態(在控制項的所有執行個體間共用),因此僅為每個事件建立一次。下面的代碼顯示了C#事件的屬性模型,這是一個Logon事件的聲明。

        public event EventHandler Logon {
            add {
                Events.AddHandler(EventLogon, value);
            }
            remove {
                Events.RemoveHandler(EventLogon, value);
            }
        }
最後看看On<EventName>(處理事件)方法的實現。這種方法主要用來引發事件。當用事件的屬性模型時,必須從EventHanderList中取回委託,然後在調用附加的處理常式前,將其轉變成事件委託類型。

 
       protected virtual void OnLogon(EventArgs e) {
            EventHandler logonHandler = (EventHandler)Events[EventLogon];
            if (logonHandler != null) {
                logonHandler(this, e);
            } 
        }

註:這裡logonHandler已經是委託類型的執行個體,故而logon
註:System.ComponentModel.EventHandlerList 提供一個簡單的委託列表。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.