ASP.NET控件開發(fā)之控件生成器怎么用

這篇文章給大家分享的是有關(guān)ASP.NET控件開發(fā)之控件生成器怎么用的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)服務(wù)項目包括延津網(wǎng)站建設(shè)、延津網(wǎng)站制作、延津網(wǎng)頁制作以及延津網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,延津網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到延津省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

ASP.NET控件開發(fā)之控件生成器1.錯誤的代碼,無法解析

首先來看一段簡單的代碼

正確             ﹤asp:Wizard ID="Wizard1" runat="server"﹥                 ﹤WizardSteps﹥                     ﹤asp:WizardStep ID="WizardStep1" runat="server" Title="Step 1"﹥                         21212﹤/asp:WizardStep﹥                     ﹤asp:WizardStep ID="WizardStep2" runat="server" Title="Step 2"﹥                     ﹤/asp:WizardStep﹥                 ﹤/WizardSteps﹥             ﹤/asp:Wizard﹥             錯誤             ﹤asp:Wizard ID="Wizard2" runat="server"﹥                 ﹤asp:WizardStep ID="WizardStep1" runat="server" Title="Step 1"﹥                     21212﹤/asp:WizardStep﹥                 ﹤asp:WizardStep ID="WizardStep2" runat="server" Title="Step 2"﹥                 ﹤/asp:WizardStep﹥             ﹤/asp:Wizard﹥             ﹤br /﹥             ﹤br /﹥             ﹤asp:Label ID="Label1" runat="server" Text="Label"﹥                 ﹤asp:TextBox ID="TextBox2" runat="server"﹥﹤/asp:TextBox﹥             ﹤/asp:Label﹥             ﹤br /﹥             ﹤asp:TextBox ID="TextBox3" runat="server"﹥12345﹤/asp:TextBox﹥             ﹤br /﹥             ﹤asp:Label ID="Label2" runat="server" Text="Label"﹥12345﹤/asp:Label﹥             ﹤br /﹥             ﹤br /﹥             ﹤asp:TextBox ID="TextBox1" runat="server"﹥         ﹤asp:Label runat="server" Text="Label"﹥﹤/asp:Label﹥             ﹤/asp:TextBox﹥

Wizard為asp.net2.0新增的一個控件,這個頁面發(fā)生兩個錯誤,如下圖

ASP.NET控件開發(fā)之控件生成器怎么用 

運(yùn)行此頁面后則會報錯,出現(xiàn)以下提示

ASP.NET控件開發(fā)之控件生成器之分析器錯誤

這里有一個問題,.net提供我們控件時,我們已經(jīng)形成一種定向思維,控件就是那樣寫的,如DropDownList,其中只能是套﹤asp:ListItem﹥的,那我為什么就不能套別的屬性呢?Wizard控件為什么就要加一個WizardSteps屬性才可以正常運(yùn)行呢?當(dāng)我們思考到這里,我們就該尋找答案.

ASP.NET控件開發(fā)之控件生成器2.從ParseChildren元數(shù)據(jù)屬性講起

從第五篇開始,我們多次用到了ParseChildren此特性.還請大家先看MSDN對其的解釋,其有三種情況

(1)ParseChildren(true)     第5篇我們使用集合屬性的時候我們曾經(jīng)這樣定義,如下代碼

[ParseChildren(true)]   public class Custom: Control   {   }

(2)ParseChildren(true,"﹤Default Property﹥") 第10篇當(dāng)我們定義集合屬性時,我們曾這樣定義

DropItemList為集合屬性

[ParseChildren(true, "DropItemList")]  public class DropColor:WebControl   {  }

(3)ParseChildren(false)  這個我們沒用過,也是我們要講的內(nèi)容,當(dāng)其內(nèi)部定義為flase時,那么放在此控件內(nèi)的元素將被解析成控件,應(yīng)該說是頁分析器ControlBuilder 類.這里大家可以看看MSDN文檔對ControlBuilder 類的解釋,至少要先知道這一點

默認(rèn)情況下,頁上的每個控件都與一個默認(rèn)的 ControlBuilder 類關(guān)聯(lián)。

下面我們慢慢看下來.

ASP.NET控件開發(fā)之控件生成器3.控件與集合屬性

讓我們再次回憶一下ParseChildren的用法,本次的示例代碼取自asp.net2.0揭密

(1)ParseChildren(true,"﹤Default Property﹥")的使用

此控件實現(xiàn)效果為隨機(jī)顯示一個內(nèi)部控件內(nèi)容

RItem為一個繼承Control的控件,其內(nèi)部未實現(xiàn)任何東西,你可以在其控件內(nèi)部輸出呈現(xiàn),記得上面說的ControlBuilder 類默認(rèn)關(guān)聯(lián)

ASP.NET控件開發(fā)之控件生成器示例一

[ParseChildren(true, "Items")]  public class ItemRotator : CompositeControl  {      private ArrayList _items = new ArrayList();       [Browsable(false)]      public ArrayList Items      {          get { return _items; }      }       protected override void CreateChildControls()      {          Random rnd = new Random();          int index = rnd.Next(_items.Count);          Control item = (Control)_items[index];          this.Controls.Add(item);      }  }   public class RItem : Control  {   }

ASP.NET控件開發(fā)之控件生成器頁面代碼

﹤custom:ItemRotator      id="ItemRotator1"     Runat="server"﹥      ﹤custom:ritem ID="Item1" runat="server"﹥          First Item      ﹤/custom:ritem﹥      ﹤custom:ritem ID="Item2" runat="server"﹥          Second Item          ﹤asp:Calendar              id="Calendar1"             Runat="server" /﹥      ﹤/custom:ritem﹥      ﹤custom:ritem ID="Item3" runat="server"﹥          Third Item      ﹤/custom:ritem﹥  ﹤/custom:ItemRotator﹥


效果就不說了,隨機(jī)顯示ritem控件的內(nèi)容,注意以上控件定義了一個Items集合屬性

另外改進(jìn)的話就是我們第十篇的講的,為Ritem定義屬性,作為一個集合屬性,這里就不再列出代碼.

(1)ParseChildren(false)的使用

此控件未添加屬性,而多了一個方法AddParsedSubObject()

控件有默認(rèn)的頁面分析邏輯,重寫AddParsedSubObject方法,可以向控件添加子控件

ASP.NET控件開發(fā)之控件生成器示例二

[ParseChildren(false)]   public class ContentRotator : WebControl   {        protected override void AddParsedSubObject(object obj)       {           if (obj is Content)               base.AddParsedSubObject(obj);       }        protected override void RenderContents(HtmlTextWriter writer)       {           Random rnd = new Random();           int index = rnd.Next(this.Controls.Count);           this.Controls[index].RenderControl(writer);       }   }   [   ToolboxItem(false)   ]   public class Content : Control   {   }

ASP.NET控件開發(fā)之控件生成器頁面代碼

﹤custom:ContentRotator          id="ContentRotator1"         Runat="server"﹥          ﹤custom:Content              id="Content1"             Runat="server"﹥              顯示的***項,此不為屬性              ﹤/custom:Content﹥              ﹤custom:Content              id="Content2"             Runat="server"﹥              顯示的第二項,此不為屬性              ﹤asp:Calendar                  id="Calendar1"                 Runat="server" /﹥              ﹤/custom:Content﹥              ﹤custom:Content              id="Content3"             Runat="server"﹥              顯示的第三項,此不為屬性            ﹤/custom:Content﹥        ﹤/custom:ContentRotator﹥

注意:ContentRotator無任何屬性(其內(nèi)部添加的為控件),而是用AddParsedSubObject 方法向控件添加了子控件,而不像ItemRotator控件一樣,其內(nèi)部是屬性而非控件.

ASP.NET控件開發(fā)之控件生成器4.修改默認(rèn)解析邏輯

上面已經(jīng)說過每個控件都有默認(rèn)的解析邏輯,其通過ControlBuilder 類來實現(xiàn),可以通過重寫其方法來自定義解析邏輯.下面通過一個例子來說明,它把一個控件以自定義標(biāo)簽所代替

以下列出部分代碼

ASP.NET控件開發(fā)之控件生成器示例三

//自定義頁分析器  public class ServerTabsBuilder : ControlBuilder  {      public override Type GetChildControlType(string tagName, IDictionary attribs)      {          if (String.Compare(tagName, "tab", true) == 0)              return typeof(ServerTab);          else             return null;      }  }   [ToolboxItem(false)]  public class ServerTab : Control  {      private string _Text;       public string Text      {          get { return _Text; }          set { _Text = value; }      }  }

(1)ServerTabsBuilder類重寫了ControlBuilder類的

GetChildControlType 方法  獲取與子標(biāo)記對應(yīng)的控件類型的 Type

在此方法中,其以tab標(biāo)簽代替了ServerTab控件,改寫了頁分析邏輯

ControlBuilder類常用的還有AllowWhitespaceLiterals 方法 其指定控件之間是否允許存在空白,大家可以重寫此方法,然后測試下就明白了

(2)定義一個簡單的ServerTab控件.

還須在父控件中重寫AddParsedSubObject方法將ServerTab控件添加到子控件中

protected override void AddParsedSubObject(object obj)  {      if (obj is ServerTab)          base.AddParsedSubObject(obj);  }

(3)***還需要把控件生成器跟控件關(guān)聯(lián)起來,當(dāng)然還要設(shè)置ParseChildren(false)

[ControlBuilder(typeof(ServerTabsBuilder))]  [ParseChildren(false)]  public class ServerTabs : WebControl, IPostBackEventHandler  {  }

好了,這里主要代碼就實現(xiàn)了,呈現(xiàn)代碼大家可在后面下載,下面看下頁面代碼

﹤%--以上省略css代碼--%﹥      ﹤custom:ServerTabs          ID="ServerTabs1"         Runat="Server"﹥          ﹤tab Text="First Tab"﹥          ﹤asp:Label ID="Label1" runat="server" Text="Label"﹥﹤/asp:Label﹥            Contents of the first tab          ﹤/tab﹥              ﹤tab Text="Second Tab"﹥            Contents of the second tab          ﹤/tab﹥              ﹤tab Text="Third Tab"﹥            Contents of the third tab          ﹤/tab﹥          ﹤/custom:ServerTabs﹥

以上鑲套代碼為tab標(biāo)簽,而非﹤custom:ServerTabs﹥﹤/custom:ServerTabs﹥,但實現(xiàn)效果是一樣的,只是我們改了默認(rèn)的頁分析邏輯,自定義了控件頁生成器(分析器)看下效果(當(dāng)重新編譯后需要重新啟動vs2005才能看到效果)

ASP.NET控件開發(fā)之控件生成器怎么用

好了,這次的主題也講完了,這里需要注意的是asp.net2.0中復(fù)合控件只需要繼承CompositeControl類即可.

感謝各位的閱讀!關(guān)于“ASP.NET控件開發(fā)之控件生成器怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

本文名稱:ASP.NET控件開發(fā)之控件生成器怎么用
文章地址:http://bm7419.com/article36/pcojpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站策劃、營銷型網(wǎng)站建設(shè)商城網(wǎng)站、面包屑導(dǎo)航全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)