asp.net控件開發基礎(7)

作者: Clingingboy  來源: 博客園  發布時間: 2010-10-02 19:35  閱讀: 912 次  推薦: 1   原文鏈接   [收藏]  

  這次我們要討論的是復合控件.本文無法一步到位完整介紹,因為討論的篇幅比較大,所以分兩次寫,這次就先講些基本概念吧,剩著的下次寫。好象復合控件網上已經有很多教程了,相信大家也看過很多.如果看過的朋友就當我再廢話一便,沒看過的朋友希望能給你帶來幫助。

  1.復合控件概念

  復合控件跟用戶控件有很多相似點,最大不同就是用戶控件后綴為ascx,而復合控件編譯后則為dll文件,還可以分發給大家使用,另外其他不同點還請參考MSDN吧,說白了,復合控件靈活性更大。

  2.復合控件的呈現

  (1)一般控件的呈現

  從第一篇到第六篇為止,我們用以呈現控件的方法介紹過的有Render方法和RenderContents方法.回顧一下吧,看以下其中的一小段代碼。

  示例一

 
public override void Render(HtmlTextWriter writer)
{
..
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.AddAttribute(HtmlTextWriterAttribute.Name,
"CreditCardNo");
writer.AddAttribute(HtmlTextWriterAttribute.Id,
"CreditCardNo");
writer.AddAttribute(HtmlTextWriterAttribute.Type,
"text");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
writer.RenderEndTag();

}

  以前我們所做的控件都是上面這樣的寫法.我們可以認為在Render方法實現了以下兩個功能。

  一.標簽布局(如td標簽,讓控件呈現的好看點

  二.呈現的標簽(如input標簽)

  (2)復合控件的呈現方法

  我們知道asp.net控件庫里面已經提供給了我們像TextBox這樣的控件了,就如組裝電腦一下,你可以組裝.net提供你現有的控件,然后重新拼湊成一個新的控件,這樣便成了復合控件.但其呈現方法卻又不同。復合控件是以包含子控件的形式呈現的,具體的呈現交給子控件自己去做,因為子控件自身都已經實現了其呈現方法(每個控件都繼承自Control類).假設你還不明白就看下面的圖吧。

  LabelTextBox1為復合控件,LabelTextBox2則不是.兩者的呈現方式是不同的.具體實現方法請看下文

  3.完成基本復合控件基本呈現

  (1)首先你要熟悉以下的屬性和方法

  Control.CreateChildControls 方法用于創建子控件。

  Control.EnsureChildControls 方法用于確認是否已創建子控件,如果未創建完成的話則調用CreateChildControls 方法創建子控件

  Control.ChildControlsCreated 屬性 獲取一個值,是否已創建子控件。

  (2)了解并實現INamingContainer接口

  用戶控件UserControl類則繼承了INamingContainer接口,確包保子控件具有唯一的ID名稱,那復合控件也需要實現這個接口達到一樣的目的,這個是值得注意的地方。復合控件以類撰寫的方法來添加控件即CreateChildControls 方法,而非在Render方法中以下面方式實現

 
writer.RenderBeginTag(HtmlTextWriterTag.Input);

  在復合控件里Render方法的作用只是為我們提供布局的需要 。下面看一個完成的代碼,以微軟的示例為例子.一個登錄控件。先看效果如下

  再來看看代碼吧,其實以下代碼并不復雜.只不過屬性多一點而已.看下面步驟

  先定義控件類很簡單;

  然后定義幾個公開的屬性,注意每個屬性都有一個EnsureChildControls 方法,因為返回的都是控件的屬性,而我們又無法判斷控件是否已經創建,所以須用此方法確保已創建控件,然后才可以使用其屬性;

  再通過類撰寫方法CreateChildControls來添加子控件;

  最后在Render方法實現布局以及用控件的RenderControl方法呈現自身標簽內容,最后還要注意Render方法中的AddAttributesToRender方法,以前已經解釋過這個方法的用處了,不調用此方法就無福享用WebControl類提供給你諸多樣式屬性了。

  以下注意的地方均以紅字標出.說了一大堆了,看看下面代碼,你明白了沒?
  示例二

 
public class CompositeLogin : WebControl, INamingContainer
{


private Button _button;
private TextBox _nameTextBox;
private Label _nameLabel;
private TextBox _passwordTextBox;
private Label _passwordLabel;
private RequiredFieldValidator _nameValidator;
private RequiredFieldValidator _passwordValidator;

屬性 Properties delegated to child controls

方法 Overriden methods
}

  4.控件狀態以及性能方面的選擇

  上面的例子你會發現,再點擊按鈕以后,textbox值狀態被保存了下來,還記得以前以Render方法直接呈現input標簽的控件嗎?在點擊按鈕以后textbox值狀態是無法保存的。

  第三篇的時候,我們討論了數據回傳的一些知識,我們也定義了一個textbox控件,在點擊按鈕以后,可以完美的保存其值狀態,至于原因,還請大家參考下文,作者已經分析的很清楚了.

  ASP.NET 控件開發速成教程:生成復合控件

  關于性能方面的問題,以下引用MSDN,具體大家還須參考MSDN。雖然創作復合控件相對比較容易,但是由于在撰寫時必須創建子控件,所以會出現性能系統開銷。如果您想優化控件的性能,可以通過重寫 Render 方法,自己實現呈現邏輯。另外,必須實現控件所需的任何回發數據處理和回發事件處理。

上一篇:asp.net控件開發基礎(6)

下一篇:asp.net控件開發基礎(8)
1
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()