上一篇文章介紹了使用Control類的Render方法實現控件呈現的基本知識和示例應用。本文重點介紹另一種實現控件呈現的常用方法--使用WebControl類的RenderContents方法實現控件呈現。
基礎知識
就服務器控件而言只存在兩種情況:一種是具有外觀可視化元素的控件,還有一種是不具有外觀可視化元素的控件。如果需要開發的服務器控件包含可視化元素,那麼多數情況下,建議開發人員創建繼承自System.Web.UI.WebControls.WebControl基類的控件類。這種做法的主要原因是基於便捷性考慮。因為,WebControl類可提供服務器控件的部分與外觀有關的公共屬性、方法和事件等。通過該類定義的屬性,可以控制服務器控件的外觀和行為。例如,使用BackColor和ForeColor屬性,可以分別控制服務器控件的背景色和前景顏色;在可以顯示邊框的控件上,可以通過設置BorderWidth、BorderStyle和BorderColor屬性,控制邊框寬度、邊框樣式和邊框顏色;服務器控件的大小可以通過Height和Width屬性來指定等等。如果控件基類是Control類,那麼實現這些類似內容則非常繁瑣。
在使用WebControl基類實現控件呈現的過程中,必然要使用該類所提供的屬性和方法等成員對象。這是讀者需要重點掌握的內容。另外,對於該基類的構造函數也是不容忽視的。下面首先從WebControl的構造函數開始入手進行講解,隨後將說明常見的成員對象。
WebControl類包括三個構造函數,它們都用於初始化WebControl類的新實例,然而它們之間還存在一些細小的差異。
(1)protected WebControl ()
該構造函數用於初始化表示Span HTML元素的WebControl類的新實例。通常情況下,開發人員並不直接調用此構造函數。相反,它通常由派生類的構造函數調用以將TagKey屬性初始化為Span枚舉值。在隨後的示例中,將重寫TagKey屬性,從而調用此構造函數。
(2)public WebControl (HtmlTextWriterTag tag)
開發人員可使用此構造函數創建並初始化使用指定的System.Web.UI.HtmlTextWriterTag值的WebControl類的新實例。其中的參數tag表示HtmlTextWriterTag枚舉值之一。可能讀者對於HtmlTextWriterTag還不太熟悉。它是一個枚舉類型,其枚舉值多為HTML標記,例如,A、B、Bold、Button等等。
(3)protected WebControl (string tag)
使用此構造函數可創建並初始化使用指定的HTML標記的WebControl類的新實例。其中參數tag表示HTML標記。當使用該構造函數時一定要注意:不能直接調用此構造函數。相反,它通常由派生類的構造函數調用以初始化TagKey和TagName屬性。
在了解了WebControl類的構造函數之後,讀者還必須了解WebControl類的一些常用屬性和方法。下面列舉了這些常用成員對象,它們對於實現控件呈現有著重要意義。
(1)Attributes屬性
該屬性用於獲取與控件的屬性不對應的任意特性(只用於呈現)的集合,其屬性類型為AttributeCollection。
(2)ControlStyle屬性
該屬性用於獲取服務器控件的樣式,它是Style類型。ControlStyle屬性封裝WebControl類的所有外觀屬性,如BorderColor和Font。
(3)TagKey屬性
該屬性用於獲取與此服務器控件相對應的System.Web.UI.HtmlTextWriterTag值,其屬性類型為HtmlTextWriterTag枚舉。
(4)protected virtual void AddAttributeToRender(HtmlTextWriter writer);
該方法將需要呈現的HTML屬性和樣式添加到指定的System.Web.UI.HtmlTextWriter中。注意在重寫過程中,一定要調用基類中相應的方法。
(5)public void ApplyStyle(Style s);
該方法將指定樣式的所有非空白元素復制到控件,改寫控件的所有現有的樣式元素。
(6)public void MergeStyle(Style s);
該方法將指定樣式的所有非空白元素復制到控件,但不改寫該控件現有的任何樣式元素。
(7)protected override void Render(HtmlTextWriter writer);方法
該方法重寫了Control.Render。