每次都從最原始的方法去寫一些複雜的控制項是不是很鬱悶呢?
如何可以簡單的利用現有的控制項來製作複合控制項呢?
一個很簡單的例子看一下就明白了。
1 [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
2 public class WebCustomControl1 : CompositeControl
3 {
4 public TextBox txt1 = new TextBox();
5 public Label lab = new Label();
6 public Button b = new Button();
7 public WebCustomControl1()
8 {
9 b.Text = "Click me";
10 txt1.ID = "kkk";
11 b.Click += new EventHandler(b_Click);
12 }
13
14 void b_Click(object sender, EventArgs e)
15 {
16 lab.Text = txt1.Text;
17 }
18
19 protected override void OnInit(EventArgs e)
20 {
21
22
23 base.OnInit(e);
24 }
25
26 protected override void CreateChildControls()
27 {
28 this.Controls.Add(txt1);
29 this.Controls.Add(lab);
30 this.Controls.Add(b);
31
32 }
33 protected override void RenderChildren(HtmlTextWriter writer)
34 {
35 txt1.RenderControl(writer);
36 b.RenderControl(writer);
37 lab.RenderControl(writer);
38
39 }
40 protected override HtmlTextWriterTag TagKey
41 {
42 get
43 {
44 return HtmlTextWriterTag.Div;
45 }
46 }
控制項的生命週期
(1)初始化-- --在此階段中,主要完成兩項工作:一、初始化在傳入Web請求生命週期內所需的設定;二、跟蹤檢視狀態。首先,頁面架構通過預設引發Init事件,並調用OnInit()方法,控制項開發人員可以重寫該方法為控制項提供初始化邏輯。此後,頁面架構將調用TrackViewState方法來跟蹤檢視狀態。需要注意的是:多數情況下,Control基類提供的TrackViewState方法實現已經足夠了。只有在控制項定義了複雜屬性時,開發人員才可能需要重寫TrackViewState方法。
(2)載入檢視狀態----此階段的主要任務是檢查伺服器控制項是否存在以及是否需要將其狀態恢複到它在處理之前的請求結束的狀態。因此該過程發生在頁面回傳過程中,而不是初始化請求過程。在此階段,頁面架構將自動回復ViewState字典。如果伺服器控制項不維持其狀態,或者它有能力通過預設儲存其所有狀態而使用ViewState字典,那麼開發人員則不必實現任何邏輯。針對那些無法在 ViewState字典中儲存的資料類型或者需要自訂狀態管理的情況,開發人員可以通過重寫LoadViewState方法來自訂狀態的恢複和管理。
(3)處理回傳資料----若要使控制項能夠檢查用戶端發回的表單資料,那麼必須實現System.Web.UI.IPostBackDataHandler介面的 LoadPostData()方法。因此只有處理回傳資料的控制項參與此階段。
(4)載入----至此階段開始,控制項樹中的伺服器控制項已建立並初始化、狀態已還原並且表單控制項反映了用戶端的資料。此時,開發人員可以通過重寫OnLoad()方法來實現每個請求共同的邏輯。
(5)發送回傳更改通知----在此階段,伺服器控制項通過引發事件作為一種訊號,表明由於回傳而發生的控制項狀態變化(因此該階段僅用於回傳過程)。為了建立這種訊號,開發人員必須再次使用System.Web.UI.IPostBackDataHandler介面,並實現另一方法- RaisePostBackChangedEvent()。其判斷過程為:如果控制項狀態因回傳而更改,則LoadPostData()返回true;否則返回false。頁面架構跟蹤所有返回true的控制項並在這些控制項上調用RaisePostDataChangedEvent()。
(6)處理回傳事件----該階段處理引起回傳的用戶端事件。為了便於將用戶端事件映射到伺服器端事件上進行處理,開發人員在此階段可以通過實現 System.Web.UI.IPostBackEventHandler介面的RaisePostBackEvent()方法來實現該邏輯。由此途徑,伺服器控制項將成功捕獲回傳的用戶端事件進行伺服器端的相應處理。
(7)預呈現----該階段完成在產生控制項之前所需要的任何工作。通常情況下是通過重寫OnPreRender()方法完成該工作。需要注意的是:在該階段,可以儲存在預呈現階段對控制項狀態所做的更改,而在呈現階段進行的更改則會丟失。
(8)儲存狀態----如果伺服器控制項不維持狀態,或者它有能力通過預設儲存其所有狀態而使用ViewState字典,那麼開發人員不必在該階段實現任何邏輯。因為這個儲存狀態的過程是自動的。如果伺服器控制項需要自訂狀態儲存,或者控制項無法在ViewState字典中儲存特殊的資料類型,則需要通過重寫SaveViewState()方法來實現狀態儲存。
(9)呈現----表示向HTTP輸出資料流中寫入標記文本的過程。開發人員通過重寫Render()方法使其在輸出資料流上自訂標籤文本。
(10)處置----在此階段中,通過重寫Dispose ()方法完成釋放對昂貴資源的引用,如資料庫連結等。
(11)卸載----完成的工作與"處置"階段相同,但是,開發人員通常在Dispose()方法中執行清除,而不處理Unload事件
附註:在頁面中動態添加子控制項時候也不要放在page_load裡。可以放在override oninit裡面。
asp.net生命週期
一.預初始化對象(OnPreInit)
二.初始化對象(OnInit)
三.完成初始化(OnInitComplete)
四.匯入Viewstate資料(LoadViewState)
五.用LoadPostData處理Postback資料(LoadPostData六.OnPreLoad
七.匯入對象(OnLoad)
八.RaisePostBackChanged事件(RaisePostDataChangedEvent)
九.處理用戶端PostBack事件(RaisePostBackEvent)
十.Page_OnLoadComplete十一.預先呈遞對象 OnPreRender
十二.完成預呈現(OnPreRenderComplete)
十三.儲存ControlState(SaveControlState)