理論文章(頁生命周期與自定義控件的開發(fā))_第1頁
理論文章(頁生命周期與自定義控件的開發(fā))_第2頁
理論文章(頁生命周期與自定義控件的開發(fā))_第3頁
理論文章(頁生命周期與自定義控件的開發(fā))_第4頁
理論文章(頁生命周期與自定義控件的開發(fā))_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Asp.Net 2.0 中的頁生命周期與自定義用戶控件開發(fā) 2007/10/25 摘要: Asp.Net2.0 提供自定義用戶開發(fā)的程序架構(gòu), 基于該架構(gòu)可以開發(fā)出滿足用戶特殊需求的各種可重 用的控件。自定義控件的開發(fā)同樣要遵循頁生命周期的規(guī)律。在 Asp.Net 2.0 中引入控件狀態(tài),以防止因 關(guān)閉視圖狀態(tài),而控件無法正常工作的現(xiàn)象。 關(guān)鍵詞:ASP.Net;頁生命周期(Page Life Cycle );自定義控件;控件狀態(tài)( View State) 1. 引述 1 2. 自定義控件的編程模型 1 2.1. .Net 自定義控件開發(fā)靜態(tài)模型 1 2.2. 簡單呈現(xiàn)自定義控件的開發(fā) 2 2

2、.3. 復(fù)合自定義控件的開發(fā) 5 3. 自定義控件的頁生命周期 8 3.1. 事件方法的調(diào)用順序 8 3.2. 控件狀態(tài) 10 3.3. 動(dòng)態(tài)創(chuàng)建控件 13 4. 自定義控件的開發(fā)原則 14 5. 結(jié)束語 15 參考文獻(xiàn) 15 1. 引述 在上一篇關(guān)于頁生命周期的文章中重點(diǎn)介紹了頁生命周期的基本概念,并給出了基本的頁面編程規(guī) 則。本篇文章則從自定義用戶控件開發(fā)的角度進(jìn)一步深入闡述頁生命周期的問題,并且也給出開發(fā)自定 義控件的一些基本編程規(guī)則以供參考。但是本篇文章并不闡述自定義控件的所有內(nèi)容,有關(guān)這方面的完 整幫助參見參考文獻(xiàn) 1 。 2. 自定義控件的編程模型 2.1. .Net 自定義控件開

3、發(fā)靜態(tài)模型 自定義控件與 Web用戶控件類似,是頁面組件重用的一種機(jī)制,但是它不同于Web用戶控件,它提 供了比 Web 用戶控件更強(qiáng)的設(shè)計(jì)時(shí)支持和實(shí)現(xiàn)與部署策略。但是自定義控件并不提供可視化的編程模 型,.Net框架提供基于繼承方式的編程模型。 從.Net框架提供的自定義控件的靜態(tài)模型來看,主要涉及到 WebControl、CompositeControl兩個(gè)重要 的基類,而這兩個(gè)基類都派生自 Control 基類。 WebControl 主要提供編寫 Web 自定義控件需要公共屬性、 方法,CompisteControl是.Net2.0中為簡化復(fù)合自定義控件編程工作而提供的基類,它同時(shí)又是

4、從 WebControl 派生出來的子類, 并且實(shí)現(xiàn)了 INamingContainer , ICompositeControlDesignAccessor 兩個(gè)接口, 以方便子控件的自治地唯一命名(Uniq uelD ),以及使復(fù)合控件設(shè)計(jì)器可以在設(shè)計(jì)時(shí)重新創(chuàng)建其關(guān)聯(lián)控件 的子控件。下圖表示了主要的Web自定義控件的靜態(tài)模型。 開發(fā)復(fù)合控件 自定義控件 圖1自定義控件開發(fā)的靜態(tài)編程模型 如果開發(fā)的是沒有用戶界面的自定義控件,自定義控件類直接從Control派生即可,如果開發(fā)的具有 簡單界面形式,一般這種控件最后呈現(xiàn)為一個(gè) Html標(biāo)記,則需要從 WebControl派生,而如果開發(fā)的自定 義

5、控件是由已經(jīng)存在的其他控件組合而成,則需要派生自CompositeControl。而在派生不同的類之后,還 需要去重寫一些基類方法和屬性,以保證自定義控件的正常工作。下表給出了基本派生原則。 表1自定義控件基本派生原則 派生類 原則 需要重寫的基類方法 需要重寫的基類屬性 Control 無界面呈現(xiàn)。 WebControl 呈現(xiàn)為單一 Html標(biāo)記。 RenderContents/Render TagKey .get CompositeControl 由其他控件組合而成,呈現(xiàn)為眾多 復(fù)雜的Hmtl標(biāo)記。 RecreateChildControls CreateChildControls Ren

6、der 對(duì)于其他可以重寫的方法和屬性則根據(jù)實(shí)際需要確定是否重寫。如,對(duì)于派生自WebControl的簡單 自定義控件,可以重寫方法“AddAttributesToRender 以增加呈現(xiàn)為 Html標(biāo)記后的標(biāo)記屬性(Attribute )。 2.2. 簡單呈現(xiàn)自定義控件的開發(fā) 下面定義一個(gè)類MailLink是一個(gè)呈現(xiàn)為電子郵件地址的簡單控件的實(shí)現(xiàn),它派生自WebControl基類。 代碼1 MailL ink的實(shí)現(xiàn)代碼 / /用于構(gòu)造郵件地址的控件。 / DefaultProperty (Text) Validationproperty(EMail) ParseChildren (true ,

7、 Text) System.Drawing.ToolboxBitmap (typeof (MailLink ), MailLink.bmp ) ToolboxData (v/O:MailLink)| public class MailLink : WebControl private const string _defaultText =郵件地址; / /郵件地址的顯示文本。 / Bindable (true ) Category (外觀) DefaultValue (_defaultText) PersistenceMode (PersistenceMode.InnerDefaultProp

8、erty) Localizable(true ) Description(顯示為文本。) public virtual string Text get String s = ( String )ViewState Text; return (s = null ) ? _defaultText : s); Text = value / /郵件地址,以“mailto: ”開始。 / Bindable(true ) Category (數(shù)據(jù)) DefaultValue ( ) Localizable(true ) Description(E-Mail鏈接地址。) public virtual str

9、ing EMail get String s = ( String )ViewState EMail; return (s = null ) ? : s); set / III 重寫屬性。 / protected override HtmITextWriterTag TagKey get return HtmITextWriterTag 11 / / 重寫方法。 / / vparam name=writerv/param HtmITextWriter writer) protected override void AddAttributesToRender( base .AddAttribut

10、esToRender(writer); writer.AddAttribute(HtmITextWriterAttribute.Href, mailto: + EMail); / / 重寫方法。 / / vparam name=output protected override void RenderContents( HtmITextWriter output) if ( String.IsNullOrEmpty(Text) EMail; output.Write (Text); 上述代碼中,定義了兩個(gè)屬性“Text”和“ EMail ”分別表示電子郵件地址的現(xiàn)實(shí)文本和地址本身的 鏈接,這兩

11、個(gè)屬性都被保存在視圖狀態(tài)中。重寫的屬性為“ TagKey ”,將該自定義控件呈現(xiàn)為 “ HtmITextWriterTag.A ”枚舉定義的 Html的標(biāo)記“”。重寫的方法有兩個(gè),其中“ RenderContents 用于將屬性Text”呈現(xiàn)為Html標(biāo)記內(nèi)包含的文字,而AddAttributesToRender ”用于為呈現(xiàn)的 Html 標(biāo)記加上屬性(Attribute )。該控件最終呈現(xiàn)的Html為: 代碼2 MailLink 自定義控件最終呈現(xiàn)的Html 郵件地址 雖然對(duì)于簡單控件也可以直接重寫“ Render”方法完成所有的呈現(xiàn)工作,但是這種做法并不推薦。具 體的代碼如下: 代碼3直接

12、重寫Render方法完成所有呈現(xiàn)工作 protected override void Render( HtmlTextWriter output) output.Write(a href= mailto: ” + EMail +“ ”+ Text + ”; 2.3. 復(fù)合自定義控件的開發(fā) 而對(duì)于復(fù)合自定義控件則主要通過重寫“Render”方法,對(duì)復(fù)合控件進(jìn)行呈現(xiàn)。具體的代碼可以參見 “eSchool.Web.Ul.WebControls ”命名控件下的一些派生自“CompositeControl ”的自定義復(fù)合控件的源碼。 復(fù)合控件是由眾多的子控件組合而成的,“ Render”方法只能用來呈現(xiàn)

13、所有子控件,但是創(chuàng)建子控件 的任務(wù)則是由“ CreateChildControls ”和“ RecreateChildControls ”方法來實(shí)現(xiàn)的,因此需要重寫這兩個(gè)重 要的方法。如果將上述的MailL ink自定義控件改造為一個(gè)符合控件,則具體的代碼如下: 代碼4改造為復(fù)合自定義控件的MailLink實(shí)現(xiàn) / /用于構(gòu)造郵件地址的控件。 / DefaultProperty (Text ) | .ValidationProperty(EMail)| ParseChildren (true , Text) System.Drawing.ToolboxBitmap (typeof (MailL

14、ink ), MailLink.bmp ) ToolboxData () public class MailLink : CompositeControl private conststring _defaultText =由b件地址; / /郵件地址的顯示文本。 / Bindable (true ) Category (外觀) DefaultValue (_defaultText) PersistenceMode (PersistenceMode .InnerDefaultProperty) Localizable(true ) Description(顯示為文本。) public virt

15、ual string Text get . String s = ( String )ViewState Text; return (s = null ) ? _defaultText : s); Text = value / /郵件地址,以“mailto: ”開始。 / Bindable(true ) Category (數(shù)據(jù)) DefaultValue ( ) Localizable(true ) Description(E-Mail鏈接地址。) public virtual string EMail get String s = ( String )ViewState EMail; re

16、turn (s = null ) ? :s); EMail = value / / 定義子控件。 / | HyperLink _hyperLnkEmail; / /重寫方法屬性。 / protected override void RecreateChildControls() EnsureChildControls(); / III重寫方法。 / protected override void CreateChildControls() this .Controls.Clear(); _hyperLnkEmail =new HyperLink (); _hyperLnkEmailD =hyp

17、erLnkEmail ; _hyperLnkEmail.Text =this .Text; _lnkBtnFirst.NavigateUrl =mailto: + this .EMail; this .Controls.Add(_hyperLnkEmail); / /重寫方法。 / / vparam name=writerv/param protected override void Render ( HtmlTextWriter writer) this .AddAttributesToRender(writer); writer.RenderBeginTag(HtmlTextWriterT

18、ag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); | _lnkBtnFirst.RenderControl(writer); writer.RenderEndTag(); writer.RenderEndTag(); writer.RenderEndTag(); 從上述代碼可以看出,變化主要在以下幾點(diǎn): (1) 需要派生自基類CompositeControl ”。 (2) 需要將自控件定義為自定義控件的成員變量,如:“ HyperLi nk _

19、hyperL nkEmail; ”。 (3) 需要重寫方法RecreateChildControls ”,在該方法中調(diào)用EnsureChildControls ”方法,確保 自定義控件是否包含子控件,如果不包含,則創(chuàng)建子控件。 (4) 需要重寫方法CreateChildControls ”,實(shí)例化子控件,并設(shè)置子控件的屬性。 (5) 需要重寫方法“ Render”,以呈現(xiàn)自定義控件,包括對(duì)子控件的呈現(xiàn)。 在該過程中請(qǐng)注意以下幾點(diǎn): (1) 在重寫“ CreateChildControls ”方法的時(shí)候,首先需要將當(dāng)前自定義控件的子控件集合清空, 即調(diào)用語句“ this.Controls.Cle

20、ar() ”,在將子控件實(shí)例化之后,需要將子控件添加到自定義控件的子控件集 合中,即調(diào)用語句“this.Controls.Add(_hyperLnkEmail) ”。如果不清空子控件集合,則在自定義控件重新 創(chuàng)建的時(shí)候會(huì)因?yàn)橐晥D狀態(tài)而保留上次的結(jié)果,并重復(fù)添加自控件。如果不將子控件添加到自定義控件 子控件集合中,雖然能正常呈現(xiàn)子控件,但無法響應(yīng)子控件的服務(wù)器事件。 (2) 在重寫Render”方法的時(shí)候,需要首先應(yīng)用Html標(biāo)記屬性(Attribute )呈現(xiàn),即調(diào)用語句 “ this.AddAttibutesToRender(writer) ”,以便能夠?qū)ψ远x控件應(yīng)用樣式和皮膚。 ( 3)

21、對(duì) 自 定 義 控 件 的 呈 現(xiàn) 的 時(shí) 候 , 推 薦 使 用 “ 堆 棧 方 式 ” 呈 現(xiàn) 。 上 述 代 碼 中 的 “ writer.RenderBeginTag(HtmlTextWriterTag.Table) ”即向呈現(xiàn)堆棧中送入了Html 標(biāo)記”,接著使 用“ writer.RenderBeginTag(HtmlTextWriterTag.Tr) ”進(jìn)一步送入“ ”標(biāo)記,然后在呈現(xiàn)完對(duì)應(yīng)的控件 之后,調(diào)用若干出棧呈現(xiàn)語句writer.RenderEndTag() ”,以呈現(xiàn)Html的結(jié)束標(biāo)記”等。由于采 用棧方式,因此在出棧呈現(xiàn)的時(shí)候,無須指明呈現(xiàn)的 Html 標(biāo)記。這樣處理

22、的好處在于代碼結(jié)構(gòu)較好,并 且 Html 標(biāo)記可以被 Asp.Net 框架識(shí)別在不同瀏覽器中按照相關(guān)特性進(jìn)行呈現(xiàn)。 (4)子控件的呈現(xiàn)很簡單,只需要調(diào)用子控件的方法“RenderControl ”即可完成。 3. 自定義控件的頁生命周期 自定義控件同樣遵循 Asp.Net框架對(duì)頁生命周期的處理,與 Web用戶控件相比較,除了關(guān)心主要事 件方法在一次頁生命周期中的調(diào)用順序之外,還需要了解一些被重寫的方法在一次頁生命周期中被調(diào)用 的時(shí)機(jī)。只有了解它們被調(diào)用的順序之后,才能正確地處理自定義控件的編程問題。 3.1. 事件方法的調(diào)用順序 圖 2 給出了以復(fù)合自定義控件為例的一次頁生命周期的方法調(diào)用順序

23、。從圖中可以看出,自定義控 件的事件方法與Web用戶控件一致,但是由于自定義控件的編程環(huán)境不是在Asp.Net的頁面設(shè)計(jì)環(huán)境中, 因此編寫自定義控件的事件方法時(shí),只需要重寫相關(guān)事件方法即可,如:“OnInit”、“OnLoad”、 “ OnPreRender”、“OnUnload ”。 在自定義控件的頁生命周期中,有以下幾點(diǎn)需要關(guān)注: (1) “CreateChildControls ”方法的調(diào)用相對(duì)比較特殊,雖然在圖中出現(xiàn)了兩次該方法的調(diào)用, 但是在運(yùn)行時(shí),是在不同時(shí)間內(nèi)被調(diào)用的獨(dú)立兩次,在一次頁生命周期中,仍然是只被調(diào)用一次。區(qū)別 就在于當(dāng)頁請(qǐng)求為初次頁請(qǐng)求的時(shí)候,該方法將被Asp.Net

24、框架在頁的“ Page_PreRende”事件方法被執(zhí) 行之后才被調(diào)用。但是當(dāng)回發(fā)頁請(qǐng)求的時(shí)候,由于頁生命周期需要在“Page_PreLoad”之前恢復(fù)所有控件 的動(dòng)態(tài)頁視圖狀態(tài),因此需要在該事件方法被調(diào)用之前創(chuàng)建復(fù)合控件的子控件,以便恢復(fù)其動(dòng)態(tài)視圖狀 態(tài)。 (2) “ Render”方法則是在“ Page_SaveStateComplete頁事件方法之后被調(diào)用的。 (3) 如果自定義控件的“Visible ”屬性被設(shè)置為“false”,則自定義控件的“On PreRe nder”、 “ CreateChildControls ”和“ Render” 方法將不會(huì)被調(diào)用。 頁事件 復(fù)合自定義控件

25、事件/方法 r Data Bound Event Page_PreRenderComplete Page_SaveStateComplete Render Page_Unload 圖2頁面與復(fù)合自定義控件事件及調(diào)用順序 32控件狀態(tài) Net2.0中增加了控件狀態(tài)的概念,它不同于視圖狀態(tài),控件狀態(tài)不會(huì)隨頁面或控件的視圖狀態(tài)的關(guān) 閉而丟失,以控件狀態(tài)保存的屬性值將會(huì)強(qiáng)制保存在視圖狀態(tài)承載的隱藏域中,在每次回發(fā)請(qǐng)求的過程 中都會(huì)被恢復(fù)。這樣可以保證自定義控件的關(guān)鍵屬性值不會(huì)因視圖狀態(tài)被關(guān)閉而丟失,從而影響到控件 的基本正常運(yùn)行。但是控件狀態(tài)不能大量存在,因?yàn)樗陧摳髡?qǐng)求期間總是存在,并且作為回發(fā)數(shù)據(jù)

26、處 理,會(huì)影響系統(tǒng)的系統(tǒng),應(yīng)該將關(guān)鍵性的控件屬性保存為控件狀態(tài)。 在“ eSchool.Web.Ul.WebControls ”命名空間中提供的很多復(fù)合控件是對(duì)外部控件進(jìn)行控制的自定義 控件,如:“Paging”控件就是用來為“GridView ”這樣支持分頁功能的控件提供更加豐富的分頁功能, 它有一個(gè)屬性“ControllD ”就是用來記錄需要控制分頁的外部控件的ID,如:某個(gè)頁面指定的“GridView ” 控件的ID。這樣的屬性如果在頁面回發(fā)請(qǐng)求過程中丟失,將會(huì)造成“Paging”控件無法查找到需要控制 分頁的外部控件,從而無法正常工作。 代碼5記錄為控件狀態(tài)的屬性 private st

27、ring_controlId =string .Empty; / / 控制分頁的控件ID。 / Browsable (true ) IDReferenceProperty TypeConverter (typeof(ControllDConverter ) |Defaultvalue (.). Category (數(shù)據(jù)) Description (控制分頁的控件ID。) public string ControlID get return _controlld; set _controlId =value ; 上述代碼中,記錄為控件狀態(tài)的屬性,按照普通的屬性定義方法去封裝一個(gè)在自定義控件類中定

28、義 的成員變量。為了將該屬性保存為控件狀態(tài)還需要在自定義控件的“Onlnit”事件方法中用頁面對(duì)象的 “ RegisterRequiresControlState”方法將該自定義控件注冊(cè)為需要保存控件狀態(tài)的頁面控件,以通知頁面在 保存狀態(tài)的時(shí)候,將需要保存為控件狀態(tài)的屬性保存到控件狀態(tài)中。 代碼6用RegisterRequiresControlState ”頁面方法將當(dāng)前控件注冊(cè)為需要保存控件狀態(tài)的頁面控件 / / 重寫Onlnit方法,以響應(yīng)控件的Init事件,并將當(dāng)前控件注冊(cè)為需要頁面保存其控件狀態(tài)的頁面控件。 / | / vparam name=ev/param protected ov

29、erride void Onlnit( EventArgs e) base .Onlnit(e); | Page.RegisterRequiresControlState(this ); InitControl();| 但是有上述代碼,還無法將“ControllD ”屬性保存在控件狀態(tài)中,還需要去重寫兩個(gè)重要的基類方 法SaveControlState”和“ LoadControlState ”。 代碼7保存和裝載控件狀態(tài)的代碼 / /保存控件狀態(tài)。 / / 需要保存的控件狀態(tài)對(duì)象。 | protected override object SaveControlState() System.C

30、ollections.ArrayList list = new System.Collections.ArrayList (); list.Add(base .SaveControlState();/保存基類控件狀態(tài) list.Add(_controlld); return list; / /在回發(fā)請(qǐng)求的時(shí)候去重新裝載控件狀態(tài)。 / / vparam name=savedState需要狀態(tài)的控件狀態(tài)。 protected override void LoadControlState(object savedState) if (savedState is System.Collections.

31、ArrayList ) ArrayList list = savedStateas ArrayList ; if (list.Count = 2) base .LoadControlState(listO);/恢復(fù)基類控件狀態(tài) ControlID = (string )list1; base .LoadControlState(savedState); “SaveControlState”重寫方法是用來提供需要保存到控件狀態(tài)中的對(duì)象,“LoadControlState ”重寫方 法則是從該方法的參數(shù)中恢復(fù)保存在控件狀態(tài)中的屬性值。由于控件狀態(tài)需要作為隱藏域來處理,因此 保存在控件狀態(tài)中的屬性類

32、型需要是可序列化的類型。其中“SaveC on trolState ”方法將在每次頁請(qǐng)求的 “ Page_SaveStateComplete頁面事件之前被調(diào)用,而“ LoadControlState ”方法只在頁面回發(fā)請(qǐng)求中的 “ Page_PreLoad”頁面事件之前被調(diào)用。具體調(diào)用過程參見圖。 Page_lnit Page_lnitComplete 復(fù)合自定義控件事件/方法 頁事件 Onlnit Page_Prelnit CreateChildControls Page_PreLoad Control PostBack Event Page_LoadComplete Page_PreRen

33、der LoadControlState Page_Load Page Valid f 1 Data Bound Event k. J Page_PreRenderComplete Page_SaveStateComplete Page_Unload OnLoad Control Valid 1 Ji Control PostBack Event CreateChildControls $ * OnPreRender I ,1 SaveControlState F 1 Render _J OnUnload _J 圖3 SaveControlState ”和LoadControlState ”方

34、法在頁生命周期中的調(diào)用時(shí)機(jī) 15 33動(dòng)態(tài)創(chuàng)建控件 動(dòng)態(tài)創(chuàng)建控件是指在自定義控件中,或者是在頁面中,控件的個(gè)數(shù)或者類型是隨著運(yùn)行時(shí)的要求而發(fā)生 變化的一種控件創(chuàng)建方式。在eSchool.Web.Ul.WebControls 命名空間中,用于執(zhí)行篩選的控件 Filtering ”, 其動(dòng)態(tài)增加和刪除條件構(gòu)造的過程即屬于動(dòng)態(tài)創(chuàng)建控件的過程。使用“Filtering ”控件的執(zhí)行效果如圖。 篩迭項(xiàng)比較值住輯 I B StudentlD仃會(huì)亍 t 123或 IIL* I 0 blame- ABC : 車帯 添加條件 插入雜件 刪余條件 棉迭列 一組動(dòng)態(tài)創(chuàng)建的條件表達(dá)式構(gòu)造控件 圖4 Filtering

35、 ”篩選控件動(dòng)態(tài)創(chuàng)建條件表達(dá)式構(gòu)造控件的運(yùn)行效果 在“”控件中,用于構(gòu)造篩選條件的子控件是按照組的方式,被用戶在運(yùn)行的時(shí)候動(dòng)態(tài)構(gòu)造的。對(duì)于Asp.Net 框架來說,如何保持上一次頁面請(qǐng)求過程中的這些動(dòng)態(tài)構(gòu)造的控件屬性是很關(guān)鍵的。這主要通過為每次 動(dòng)態(tài)構(gòu)造的控件保持一個(gè)唯一不重復(fù)的“ID ”屬性。Asp.Net框架按照頁面每個(gè)控件的“ ID ”屬性在視圖 狀態(tài)中尋找這些控件的上次頁請(qǐng)求保留下來的屬性值,并在當(dāng)前請(qǐng)求過程中恢復(fù)過來。因此,在為了做 到這一點(diǎn),在自定義控件的“CreateChildControls ”重寫方法中要能為動(dòng)態(tài)構(gòu)造的控件恢復(fù)性的創(chuàng)建它們 的“ ID”屬性。具體代碼請(qǐng)參見“e

36、School.Web.Ul.WebControls.Filtering ”控件的源代碼。下面的代碼是動(dòng) 態(tài)創(chuàng)建條件表達(dá)式構(gòu)造控件的核心代碼。 代碼8動(dòng)態(tài)創(chuàng)建條件表達(dá)式構(gòu)造控件的核心代碼 private const string m_CriteriaNoListViewStateName =CriteriaNoList; / /為每一個(gè)篩選條件設(shè)置一個(gè)唯一的編號(hào),以便在回發(fā)請(qǐng)求的時(shí)候重構(gòu)篩選條件。 / | Browsable (false ) Description (記錄條件編號(hào)。)| protected int CriteriaNoList get | return Utility .Get

37、ViewStatePropertyValuevint ( this .ViewState, m_CriteriaNoListViewStateName,new int 0 ); Utility .SetViewStatePropertyValuevint ( this .ViewState, m_CriteriaNoListViewStateName,value ); / III記錄在當(dāng)前頁請(qǐng)求周期中從條件編號(hào)列表中恢復(fù)過來的編號(hào)對(duì)應(yīng)的列表下標(biāo)。 / private int iCriteriaNo = 0; / /構(gòu)造空白的篩選條件行。 / / v/returns private TableR

38、ow ConstructBlankCriteriaTableRow() int iCount = (iCriteriaNo this .CriteriaNoList.Length - 1) ? Utility .GetMaxValuev int ( this .CriteriaNoList, 0) + 1 :this .CriteriaNoListiCriteriaNo; TableRow tblRow = new TableRow (); TableCell tblCell = new TableCell (); CheckBox chkBoxChooseOne = new CheckBox

39、 (); /在此處需要位當(dāng)前動(dòng)態(tài)創(chuàng)建的控件安置唯一的ID。 chkBoxChooseOne.lD =chkBoxChooseOne + iCount.ToString(); tblCell.Controls.Add(chkBoxChooseOne); tblRow.Cells.Add(tblCell); /其它動(dòng)態(tài)創(chuàng)建控件的代碼。 上述代碼中使用了一個(gè)“CriteriaNoList ”的屬性保存每次動(dòng)態(tài)創(chuàng)建的條件表達(dá)式的控件ID屬性的一 個(gè)順序編碼,并且將其保存在視圖狀態(tài)中,以便下次頁請(qǐng)求的時(shí)候恢復(fù)過來。在 ConstructBlankCriteriaTableRow ”方法中,為每個(gè)動(dòng)態(tài)創(chuàng)建

40、的控件依照恢復(fù)過來的CriteriaNoList ”中 的記錄恢復(fù)ID。 由于動(dòng)態(tài)創(chuàng)建控件的問題,關(guān)鍵在于控件的ID需要是唯一的。 4. 自定義控件的開發(fā)原則 由于自定義控件對(duì)代碼編寫能力和頁生命周期的理解要求較高,如果沒有處理好頁生命周期的問題, 很容易引發(fā)設(shè)計(jì)時(shí)和運(yùn)行的錯(cuò)誤,因此,需要有一個(gè)開發(fā)指導(dǎo)性原則會(huì)幫助寫出正確的控件。以下是在 開發(fā)“”命名空間中的自定義控件時(shí)總結(jié)出來的原則。 (1) 首先要了解頁事件方法和自定義控件方法之間的調(diào)用順序,具體參見以上陳述。 (2) 對(duì)于復(fù)合自定義控件中的子控件,以及需要控制的外部控件需要定義為自定義控件的成員變 量。 ( 3) 對(duì)于復(fù)合自定義控件中的子控件一定是在“ CreateChildControls ”重寫方法中實(shí)例化。如果子 控件很多,請(qǐng)按照自己的分類將它們分組創(chuàng)建,并寫在不同的私有方法中,然后同時(shí)在 “ CreateChildControls ” 一 并 調(diào) 用 , 如 : “ ConstructBlankCriteriaTableRow ” 、 “ ConstructCommandControl ”、“ ConstructCriteriaTable

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論