這篇文章給大家分享的是有關(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è)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,延津網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到延津省份的部分城市,未來相信會繼續(xù)擴大服務(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ā)生兩個錯誤,如下圖
運行此頁面后則會報錯,出現(xiàn)以下提示
ASP.NET控件開發(fā)之控件生成器之分析器錯誤
這里有一個問題,.net提供我們控件時,我們已經(jīng)形成一種定向思維,控件就是那樣寫的,如DropDownList,其中只能是套﹤asp:ListItem﹥的,那我為什么就不能套別的屬性呢?Wizard控件為什么就要加一個WizardSteps屬性才可以正常運行呢?當我們思考到這里,我們就該尋找答案.
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篇當我們定義集合屬性時,我們曾這樣定義
DropItemList為集合屬性
[ParseChildren(true, "DropItemList")] public class DropColor:WebControl { }
(3)ParseChildren(false) 這個我們沒用過,也是我們要講的內(nèi)容,當其內(nèi)部定義為flase時,那么放在此控件內(nèi)的元素將被解析成控件,應(yīng)該說是頁分析器ControlBuilder 類.這里大家可以看看MSDN文檔對ControlBuilder 類的解釋,至少要先知道這一點
默認情況下,頁上的每個控件都與一個默認的 ControlBuilder 類關(guān)聯(lián)。
下面我們慢慢看下來.
ASP.NET控件開發(fā)之控件生成器3.控件與集合屬性
讓我們再次回憶一下ParseChildren的用法,本次的示例代碼取自asp.net2.0揭密
(1)ParseChildren(true,"﹤Default Property﹥")的使用
此控件實現(xiàn)效果為隨機顯示一個內(nèi)部控件內(nèi)容
RItem為一個繼承Control的控件,其內(nèi)部未實現(xiàn)任何東西,你可以在其控件內(nèi)部輸出呈現(xiàn),記得上面說的ControlBuilder 類默認關(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﹥
效果就不說了,隨機顯示ritem控件的內(nèi)容,注意以上控件定義了一個Items集合屬性
另外改進的話就是我們第十篇的講的,為Ritem定義屬性,作為一個集合屬性,這里就不再列出代碼.
(1)ParseChildren(false)的使用
此控件未添加屬性,而多了一個方法AddParsedSubObject()
控件有默認的頁面分析邏輯,重寫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.修改默認解析邏輯
上面已經(jīng)說過每個控件都有默認的解析邏輯,其通過ControlBuilder 類來實現(xiàn),可以通過重寫其方法來自定義解析邏輯.下面通過一個例子來說明,它把一個控件以自定義標簽所代替
以下列出部分代碼
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 方法 獲取與子標記對應(yīng)的控件類型的 Type
在此方法中,其以tab標簽代替了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)起來,當然還要設(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標簽,而非﹤custom:ServerTabs﹥﹤/custom:ServerTabs﹥,但實現(xiàn)效果是一樣的,只是我們改了默認的頁分析邏輯,自定義了控件頁生成器(分析器)看下效果(當重新編譯后需要重新啟動vs2005才能看到效果)
好了,這次的主題也講完了,這里需要注意的是asp.net2.0中復(fù)合控件只需要繼承CompositeControl類即可.
感謝各位的閱讀!關(guān)于“ASP.NET控件開發(fā)之控件生成器怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
本文名稱:ASP.NET控件開發(fā)之控件生成器怎么用
文章地址:http://www.rwnh.cn/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)