ASP.NET Server Control Design Time Support
2024-07-10 13:04:04
供稿:網(wǎng)友
asp.net server control design time support
做過自己的 asp.net server control 了嗎?有沒有象 asp.net datagrid 控件那樣:
1。從 toolbox 一拽出來,自動(dòng)產(chǎn)生一堆代碼
2。right click 看屬性時(shí),有一大堆 custom attribute
3。還能進(jìn)入 template edit 模式把 toolbox 里的 textbox 之類的東東拽到你的控件中
4。甚至還能彈出一個(gè)自己的對話框來做巨復(fù)雜的配置
我花了一天時(shí)間來看如何做這些東東,雖然最后發(fā)現(xiàn)目前我不需要這些 features 但是還是
愿意和大家分享一下,有些東東你不去看真的不知道原來如此簡單,正如同有些東西你看完
發(fā)現(xiàn)居然如此復(fù)雜一樣。
主要文檔: (注意 url 換行)
msdn lib: enhancing design-time support
http://msdn.microsoft.com/library/default.asp?
url=/library/en-us/cpguide/html/cpconenhancingdesign-timesupport.asp
pdc02 session 407 名字好像是 build asp.net server control 之類的。
msdn 文檔第一段里就開門見山說:
in the .net framework, the work for design-time support is not delegated to a
design environment such as visual studio .net but is enabled through a rich
built-in design-time architecture.
所以你要做的東東不是什么 vs.net add-on,而是直接擴(kuò)展你的控件。
1。從 toolbox 一拽出來,自動(dòng)產(chǎn)生一堆代碼
這件事情是通過在你的 server control 代碼里加個(gè) attribute 實(shí)現(xiàn)的:
(要不怎么說 attribute programming 呢)
[toolboxdata("<{0}:mycontrol runat=server></{0}:mycontrol>")]
public class mycontrol : system.web.ui.webcontrols.datagrid // 隨便舉個(gè)例子
這樣你把你的控件拽到 webform 里面時(shí),它就會自動(dòng)生成這些代碼樂。
2。right click 看屬性時(shí),有一大堆 custom attribute
比如說你的控件里面有個(gè)屬性是指定 xsl file 的 url,你可以這樣:
[
browsable(true),
category("data"),
defaultvalue("http://myserver/myapp/myxsl.xsl"),
description("specify your xsl file url"),
editor(typeof(system.web.ui.design.xslurleditor),
typeof(system.drawing.design.uitypeeditor))
]
public string myxsltsrc {...}
如此這般,你就可以在屬性對話框的 data 組中看到你的 myxsltsrc 樂,
而且你可以通過一個(gè)專門的選 xsl url 的對話框來指定這個(gè)值樂。
3。還能進(jìn)入 template edit 模式把 toolbox 里的 textbox 之類的東東拽到你的控件中
免費(fèi)午餐結(jié)束了。剩下東東真的要寫代碼了。
首先得告訴控件你為它老人家專門作了個(gè) designer:
[ designer("yournamespace.design.mycontroldesigner, yournamespace") ]
public class mycontrol : system.web.ui.webcontrols.datagrid // 隨便舉個(gè)例子
然后真的給它老人家做個(gè) designer:
namespace yournamespace.design
{
public class mycontroldesigner : system.web.ui.design.webcontrols.datagriddesigner
{ // 由于 control 是從 datagrid 繼承的,control designer 也就從 datagriddesigner 繼承
}
}
這個(gè) designer 主要要做什么事情呢?
你至少要 render 出一段 html code 來,這樣在 vs.net ide 的 design view 里你才能看見
您老辛辛苦苦做的 control。
主要通過 override 這些 methods:
public override string getdesigntimehtml()
protected override string getemptydesigntimehtml()
比如你的控件支持 data binding 什么的,你可以考慮使用一些 sample data 去顯示。
或者多做些工作真的把 page developer 指定的 data source 綁定了顯示出來。
仔細(xì)看文檔你就會發(fā)現(xiàn)如何建立 edit template。做了 edit template 后你 right click 你的
控件就可以進(jìn)入編輯模式,比如你的控件中包含一個(gè) content template,你就可以把 toolbox 里
的 asp.net textbox, checkbox 之類的東東直接 drag & drop 到里面去樂。
4。甚至還能彈出一個(gè)自己的對話框來做巨復(fù)雜的配置
要想實(shí)現(xiàn)這個(gè)還要多花些功夫,你必須再做一個(gè) mycontrolcomponenteditor,
public class mycontrolcomponenteditor : system.web.ui.design.webcontrols.datagridcomponenteditor
并且告訴 mycontrol 它老人家請用這個(gè) editor:
[editor(typeof(mycontrolcomponenteditor), typeof(componenteditor))]
public class mycontrol : system.web.ui.webcontrols.datagrid // 隨便舉個(gè)例子
如何通過 override methods 去具體實(shí)現(xiàn),自己查文檔 8。
休息,休息一下。
菜鳥學(xué)堂: