您好,登錄后才能下訂單哦!
本篇內容介紹了“.NET自定義控件應該如何實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
.NET自定義控件有很多人其實不太適應去試用,一般都是從Control來繼承,但是如果在工作中積累一定量的.NET自定義控件,對今后的工作是很有幫助的。
自己對C#與.NET的學習并不算深入,只是這段時間要用ASP.NET來做項目,也是出去無奈,只好好的學習了一番,學完后,感覺的確很好,加上Visual Studio的集成開發環境,這個開發的確迅速,而且容易上手,項目很快就要完工了,現在來總結點當時沒顧得上總結的東西,決定深入下.NET。
在開發項目的時候,其實我根本就不知道怎么去做.NET自定義控件,有一個復選框級聯選擇的功能,我用的是ThreeView控件做的,當時并不知道怎么去添加TreeView子節點控件的響應事件,應是用js+dom在客戶端添加TreeView生成html元素的事件,很麻煩也費力,也不便維護。
所以這次深入,決定先從.NET自定義控件入手,看了一些資料,關于自定義的控件的。自己想了想如果能夠知道.net控件庫中的控件類是怎么寫的,那不更好的操縱已有的控件和更好地開發自定義控件。到網上找了下,就在博客園上找到了一個C#反編譯器Reflector(下載地址http://downloads.red-gate.com/reflector.zip),很好用,能夠把.NET庫給反編譯出來。
從自己的幾乎開始,先看控件部分的,按照Vs中工具箱面板中的控件順序看看,這些控件類的源代碼
***個當然是簡單的Label類了
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內置成員,寫過自定義控件的朋友都知道,一般要重載Control類的Render方法,.net庫中帶的控件類,也不例外,也是要重載這個方法的
Label比較簡單,我們托一個頁面可以看到其生成html為Label相當簡單的,我們可以寫這樣一個類來模擬Label類
public class MyLabel : Control { public MyLabel() { } protected override void Render(HtmlTextWriter writer) { writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.Write("Label"); writer.RenderEndTag(); } }
在aspx對應的cs文件的load方法中寫入如下代碼
protected void Page_Load(object sender, EventArgs e) { MyLabel ml = new MyLabel(); this.form1.Controls.Add(ml); }
我們可以看到結果的html和.net庫中的Label(少了id,呵呵)是一樣的,當然了,這只是一種,很簡單的模仿,如果Label的其他屬性設置了,html內容就會變化的
看上門的Label的源碼,大家并沒有看到Label中重載Render方法是吧,其實這個是在 RenderContents方法中調用了父類WebControl的Rende方法,而WebControl中實現了對Render方法的重載。
看看Label.RenderContents()
Code protected internal override void RenderContents(HtmlTextWriter writer) { if (base.HasRenderingData()) { base.RenderContents(writer); } else { writer.Write(this.Text); } }
而我們自定義控件的時候,經常直接從Control繼承,雖然是WebControl性質的,雖然有WebControl,但是很多就是喜歡從Control來繼承,不知道為什么,不過我并不怎么贊成。畢竟那樣從軟件設計上來看就是一種冗余吧,也許WebControl不符合很多朋友們的使用吧。
在Label中AddAttributesToRender方法實現了動態添加屬性和顯示屬性。
我的學習方法就是從表面上知道好東東怎么用之后,就開始深入,了解其運行機制、實現原理,那樣就可以很輕松地把整個框架系統的理解下來,可以上下統一,以后做東西可以不管底層的東西,但做起來可以游刃有余。
這里有個HtmlWriterText類,估計有的朋友不知道是干啥子用的,我找了兩篇文章,不明白的朋友可以看下
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自定義控件應該如何實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。