新聞中心
.NET自定義控件有很多人其實(shí)不太適應(yīng)去試用,一般都是從Control來(lái)繼承,但是如果在工作中積累一定量的.NET自定義控件,對(duì)今后的工作是很有幫助的。

目前成都創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、北屯網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
自己對(duì)C#與.NET的學(xué)習(xí)并不算深入,只是這段時(shí)間要用ASP.NET來(lái)做項(xiàng)目,也是出去無(wú)奈,只好好的學(xué)習(xí)了一番,學(xué)完后,感覺(jué)的確很好,加上Visual Studio的集成開(kāi)發(fā)環(huán)境,這個(gè)開(kāi)發(fā)的確迅速,而且容易上手,項(xiàng)目很快就要完工了,現(xiàn)在來(lái)總結(jié)點(diǎn)當(dāng)時(shí)沒(méi)顧得上總結(jié)的東西,決定深入下.NET。
在開(kāi)發(fā)項(xiàng)目的時(shí)候,其實(shí)我根本就不知道怎么去做.NET自定義控件,有一個(gè)復(fù)選框級(jí)聯(lián)選擇的功能,我用的是ThreeView控件做的,當(dāng)時(shí)并不知道怎么去添加TreeView子節(jié)點(diǎn)控件的響應(yīng)事件,應(yīng)是用js+dom在客戶端添加TreeView生成html元素的事件,很麻煩也費(fèi)力,也不便維護(hù)。
所以這次深入,決定先從.NET自定義控件入手,看了一些資料,關(guān)于自定義的控件的。自己想了想如果能夠知道.net控件庫(kù)中的控件類(lèi)是怎么寫(xiě)的,那不更好的操縱已有的控件和更好地開(kāi)發(fā)自定義控件。到網(wǎng)上找了下,就在博客園上找到了一個(gè)C#反編譯器Reflector(下載地址http://downloads.red-gate.com/reflector.zip),很好用,能夠把.NET庫(kù)給反編譯出來(lái)。
從自己的幾乎開(kāi)始,先看控件部分的,按照Vs中工具箱面板中的控件順序看看,這些控件類(lèi)的源代碼
***個(gè)當(dāng)然是簡(jiǎn)單的Label類(lèi)了
- Code
- DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ControlValueProperty("Text"), ControlBuilder(typeof(LabelControlBuilder)), DefaultProperty("Text"), ParseChildren(false), Designer("System.Web.UI.Design.WebControls.LabelDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ToolboxData("<{0}:Label runat=\"server\" Text=\"Label\">"), AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
- public class Label : WebControl, ITextControl
- {
- // Methods
- public Label();
- internal Label(HtmlTextWriterTag tag);
- protected override void AddAttributesToRender(HtmlTextWriter writer);
- protected override void AddParsedSubObject(object obj);
- protected override void LoadViewState(object savedState);
- protected internal override void RenderContents(HtmlTextWriter writer);
- // Properties
- [WebCategory("Accessibility"), Themeable(false), IDReferenceProperty, TypeConverter(typeof(AssociatedControlConverter)), DefaultValue(""), WebSysDescription("Label_AssociatedControlID")]
- public virtual string AssociatedControlID { get; set; }
- internal bool AssociatedControlInControlTree { get; set; }
- internal override bool RequiresLegacyRendering { get; }
- protected override HtmlTextWriterTag TagKey { get; }
- [PersistenceMode(PersistenceMode.InnerDefaultProperty), WebCategory("Appearance"), Bindable(true), DefaultValue(""), WebSysDescription("Label_Text"), Localizable(true)]
- public virtual string Text { get; set; }
- }
Expand Methods
這些是Label內(nèi)置成員,寫(xiě)過(guò)自定義控件的朋友都知道,一般要重載Control類(lèi)的Render方法,.net庫(kù)中帶的控件類(lèi),也不例外,也是要重載這個(gè)方法的
Label比較簡(jiǎn)單,我們托一個(gè)頁(yè)面可以看到其生成html為L(zhǎng)abel相當(dāng)簡(jiǎn)單的,我們可以寫(xiě)這樣一個(gè)類(lèi)來(lái)模擬Label類(lèi)
- public class MyLabel : Control
- {
- public MyLabel()
- { }
- protected override void Render(HtmlTextWriter writer)
- {
- writer.RenderBeginTag(HtmlTextWriterTag.Span);
- writer.Write("Label");
- writer.RenderEndTag();
- }
- }
在aspx對(duì)應(yīng)的cs文件的load方法中寫(xiě)入如下代碼
- protected void Page_Load(object sender, EventArgs e)
- {
- MyLabel ml = new MyLabel();
- this.form1.Controls.Add(ml);
- }
我們可以看到結(jié)果的html和.net庫(kù)中的Label(少了id,呵呵)是一樣的,當(dāng)然了,這只是一種,很簡(jiǎn)單的模仿,如果Label的其他屬性設(shè)置了,html內(nèi)容就會(huì)變化的
看上門(mén)的Label的源碼,大家并沒(méi)有看到Label中重載Render方法是吧,其實(shí)這個(gè)是在 RenderContents方法中調(diào)用了父類(lèi)WebControl的Rende方法,而WebControl中實(shí)現(xiàn)了對(duì)Render方法的重載。
看看Label.RenderContents()
- Code
- protected internal override void RenderContents(HtmlTextWriter writer)
- {
- if (base.HasRenderingData())
- {
- base.RenderContents(writer);
- }
- else
- {
- writer.Write(this.Text);
- }
- }
而我們自定義控件的時(shí)候,經(jīng)常直接從Control繼承,雖然是WebControl性質(zhì)的,雖然有WebControl,但是很多就是喜歡從Control來(lái)繼承,不知道為什么,不過(guò)我并不怎么贊成。畢竟那樣從軟件設(shè)計(jì)上來(lái)看就是一種冗余吧,也許WebControl不符合很多朋友們的使用吧。
在Label中AddAttributesToRender方法實(shí)現(xiàn)了動(dòng)態(tài)添加屬性和顯示屬性。
我的學(xué)習(xí)方法就是從表面上知道好東東怎么用之后,就開(kāi)始深入,了解其運(yùn)行機(jī)制、實(shí)現(xiàn)原理,那樣就可以很輕松地把整個(gè)框架系統(tǒng)的理解下來(lái),可以上下統(tǒng)一,以后做東西可以不管底層的東西,但做起來(lái)可以游刃有余。
這里有個(gè)HtmlWriterText類(lèi),估計(jì)有的朋友不知道是干啥子用的,我找了兩篇文章,不明白的朋友可以看下
http://msdn.microsoft.com/zh-cn/library/system.web.ui.htmltextwriter(VS.80).aspx
http://www.cnblogs.com/tonyqus/archive/2005/02/15/104576.html
.NET自定義控件應(yīng)該如何實(shí)現(xiàn)就介紹到這里。
本文來(lái)自滄桑不盡的博客園文章《怎么來(lái)自定義控件》
本文標(biāo)題:.NET自定義控件應(yīng)該如何實(shí)現(xiàn)?
當(dāng)前路徑:http://www.5511xx.com/article/dpodces.html


咨詢(xún)
建站咨詢(xún)
