ASP.NET控件設(shè)計(jì)時(shí)支持淺析
ASP.NET控件設(shè)計(jì)時(shí)支持是什么呢?大家好象對(duì)控件設(shè)計(jì)時(shí)的討論不多,是不是感覺功能實(shí)現(xiàn)就可以了,當(dāng)然設(shè)計(jì)時(shí)支持是可有可無的.我敢說沒有設(shè)計(jì)時(shí)支持的話,可能很多人不喜歡.net,正因?yàn)橛性O(shè)計(jì)時(shí)支持,更降低了.net學(xué)習(xí)的門檻.這次就簡(jiǎn)單的來看看,如果簡(jiǎn)單的實(shí)現(xiàn)你常用的幾個(gè)功能.
ASP.NET控件設(shè)計(jì)時(shí)支持一.ControlDesigner類
ControlDesigner作為web服務(wù)器控件的設(shè)計(jì)器的基類,你可以擴(kuò)展此類. 總之你了解這個(gè)類以后你會(huì)發(fā)現(xiàn)原來你平時(shí)看到的控件能夠在VS2005設(shè)計(jì)時(shí)中完美的呈現(xiàn)也是微軟幫你做的.既然如此,作為一個(gè)完美的控件也應(yīng)該配有設(shè)計(jì)時(shí)的支持,有時(shí)候可以讓開發(fā)達(dá)到事半功倍的效果.這里先不介紹這個(gè)類其中具體的方法和屬性了.我們接了會(huì)具體使用的.
ASP.NET控件設(shè)計(jì)時(shí)支持二.獲取設(shè)計(jì)時(shí)關(guān)聯(lián)控件HTML
(1) 定義控件
讓我們來定義兩個(gè)最簡(jiǎn)單的控件
- public class DesginControl : Control
- {
- public string Text
- {
- get
- {
- String s = (String)ViewState["Text"];
- return ((s == null) ? String.Empty : s);
- }
- set
- {
- ViewState["Text"] = value;
- }
- }
- protected override void Render(HtmlTextWriter writer)
- {
- writer.Write(Text);
- }
- }
- public class DesginWebControl :WebControl
- {
- public string Text
- {
- get
- {
- String s = (String)ViewState["Text"];
- return ((s == null) ? String.Empty : s);
- }
- set
- {
- ViewState["Text"] = value;
- }
- }
- protected override void RenderContents(HtmlTextWriter writer)
- {
- writer.Write(Text);
- }
- }
(2)第一次測(cè)試
好了,兩個(gè)控件一個(gè)派生自Control,一個(gè)派生于WebControl,編譯后把他們一起拖到設(shè)計(jì)器上吧,看看效果
DesignControl在Text屬性為空的時(shí)候,即沒有呈現(xiàn)任何內(nèi)容的時(shí)候,設(shè)計(jì)器上會(huì)出現(xiàn)上面這樣的文字
DesignWebControl更離譜,看到DesignWebControl文字右邊的小方框了沒,這個(gè)就是其默認(rèn)呈現(xiàn)的效果.
(2)第二次測(cè)試
下面再次給他們兩加上Text屬性后的效果,再看效果
DesignControl顯示效果很好,
DesignWebControl也可以達(dá)到跟DesignControl一樣的效果,但多了項(xiàng)功能.
其可以允許在設(shè)計(jì)器中自動(dòng)的拖拉控件改變控件的寬度和高度,看到右下腳的鼠標(biāo)和控件中間控件的115和42沒.很不幸DesignControl沒有這樣的功能.為什么呢?
(4)第三次測(cè)試
我們?cè)賮碜詈蟮囊淮螠y(cè)試.我們?cè)俅螌ext屬性的內(nèi)容去掉
效果如下
DesignControl恢復(fù)回來了,不好的是DesignWebControl成了一白板:)
(6)解決方案來了
其實(shí)上面的這兩個(gè)控件跟Literal和Label控件像極了,其本身使用一點(diǎn)問題也沒有,為了設(shè)計(jì)時(shí)更好看,也為了保護(hù)我們的眼睛看的舒服點(diǎn):),我們能做點(diǎn)什么.
一切的一切都是因?yàn)?net提供了設(shè)計(jì)時(shí)支持,不然的話,恐怕你連上面的幾個(gè)界面也看不到了.還好我們可以自己來改變它.那便是利用.net的設(shè)計(jì)時(shí)支持.
(7)每個(gè)控件都應(yīng)該有各自的設(shè)計(jì)時(shí)支持
不知道這句話,大家是否認(rèn)同,即使控件現(xiàn)在可能不需要,但請(qǐng)做好以后的準(zhǔn)備,先空定義一個(gè)也可以
下面我們討論下label控件.
7.1當(dāng)Text屬性為空時(shí),設(shè)計(jì)器呈現(xiàn)為"["加控件ID的值"]",如[Label1],注意這個(gè)是設(shè)計(jì)器呈現(xiàn),而非生成的效果呈現(xiàn).
7.2Control類沒有width和height屬性,當(dāng)然設(shè)計(jì)時(shí)也就不支持更改了.
(8)實(shí)現(xiàn)
上面說了一大堆廢話,還是來看看如何實(shí)現(xiàn)吧
- public class DesginWebControlDesigner : ControlDesigner
- {
- private DesginWebControl webControl;
- public DesginWebControlDesigner()
- { }
- //初始化控件設(shè)計(jì)器
- public override void Initialize(IComponent ponent)
- {
- base.Initialize(ponent);
- webControl = (DesginWebControl)ponent;
- webControl.Text = "DesginWebControl";
- }
- //調(diào)整控件的大小
- public override bool AllowResize
- {
- get
- {
- return false;
- }
- }
- //獲取設(shè)計(jì)器HTML
- public override string GetDesignTimeHtml()
- {
- if (webControl.Text.Length ﹥ 0)
- {
- string spec = "﹤font color='red'﹥{0}﹤/font﹥";
- return String.Format(spec, webControl.Text);
- }
- else
- return GetEmptyDesignTimeHtml();
- }
- //定義一個(gè)空的實(shí)現(xiàn)
- protected override string GetEmptyDesignTimeHtml()
- {
- string spec = "[{0}]";
- return String.Format(spec, webControl.ID);
- }
- }
(1)Initialize方法初始化控件設(shè)計(jì)時(shí)的狀態(tài)
(2)AllowResize屬性默認(rèn)為True,設(shè)置為False,控件就無法在設(shè)計(jì)器了調(diào)整控件大小了
(3)GetDesignTimeHtml方法 最終獲取控件在設(shè)計(jì)器中的狀態(tài)
(4)GetEmptyDesignTimeHtml方法 定義一個(gè)空的實(shí)現(xiàn)
定義好以后再將控件與設(shè)計(jì)器關(guān)聯(lián)起來
- [Designer(typeof(DesginWebControlDesigner))]
- public class DesginWebControl :WebControl
- {
- }
好了,現(xiàn)在就可以來測(cè)試下了
效果跟定義的一樣,這個(gè)就是設(shè)計(jì)時(shí)的效果了,當(dāng)然生成的頁面可不是這樣的,這個(gè)要區(qū)分清楚.
這時(shí)我們?cè)賮硇薷腡ext屬性,和控件的BackColor屬性,發(fā)現(xiàn)Text改變了,BackColor屬性在更改后設(shè)計(jì)器效果不變.
注意點(diǎn):
(1)GetDesignTimeHtml方法呈現(xiàn)的將是控件設(shè)計(jì)器上最終的效果,使用時(shí),你無法更改在此方法定義的效果,Initialize方法初始化的效果可以更改.
(2)頁面呈現(xiàn)效果與設(shè)計(jì)器呈現(xiàn)效果不一定相同
講了這么多就講了最基礎(chǔ)的東西,很容易理解的東西,大家可以了解下.
ASP.NET控件設(shè)計(jì)時(shí)支持相關(guān)的內(nèi)容就向你介紹到這里,希望對(duì)你了解ASP.NET控件設(shè)計(jì)時(shí)支持有所幫助。
【編輯推薦】




















