Asp.net控件开发学习笔记(三)-控件开发基础
?封裝
???? 在asp.net中,控件被分為兩類.用戶控件和自定義服務器控件。前者就是我們經常用來將一些可復用的內容封裝成的.ascx文件。這里主要研究后者.
?
創建自定義服務器控件
???? 創建自定義控件的第一步是選擇以哪一個類作為基類來創建控件,Asp.net最常見的幾個基類羅列如下:
l?System.Web.UI.Control:這是所有控件的基類,所有作為控件的類都必須直接或者間接的繼承此類,此類僅僅提供最少量的屬性和方法。
l?System.Web.UI.WebControls.WebControl:這個類繼承于Control類,在實現控件最基本的屬性和方法后,又額外提供了控件CSS樣式相關的一系列屬性。如果是UI控件,那肯定就選它了.
l?System.Web.UI.WebControls.Webpart:這個不用說了,看名字就知道是提供了WebPart相關的功能.
l?System.Web.UI.WebControls.CompositeControl:如果需要創建復合控件(即那些控件內部還有其他控件,比如Calender),選擇這個類作為基類.
l?System.Web.UI.WebControls.DatabindingControl:用于作為數據源相關控件的基類。
l?System.Web.UI.WebControls.CompositeDatabindingControl:這個基類可以看做上面兩個基類的結合,提供了上面兩個基類的功能,GridView就是繼承自這個基類.
?
簡單控件Or復合控件
???? 先來了解一下簡單控件和復合控件的定義:
?
???? 簡單控件:那些直接生成(render)對應HTML的控件,比如Botton和TextBox控件.
???? 復合控件:如何生成HTML依賴于其子控件,比如Reperater,FormView.
?
下面的圖示會讓概念更加清晰:
?
?
?? 簡單控件是那些比較簡單的更加,往往是一個控件對應一個HTML標簽.但缺點顯而易見,就是當面對大量HTML代碼片段時,就會顯得更加難以維護.
復合控件在面對大量HTML代碼片段時就顯得游刃有余了,在遵守了面向對象抽象和封裝的原則上,復合控件的維護性和易用性都不錯.
?
Demo:創建一個簡單的服務器控件:
??? 這里我們創建一個簡單的菜單自定義服務器控件。通過繼承最基礎的System.Web.UI.Control基類。然后覆蓋Render方法來達到自定義輸出的目的,代碼如下:
?
?namespace SimpleControl
{?
?? [ToolboxData("<{0}:menucustomcontrol runat=server></{0}:menucustomcontrol>")]
??? public class MenuCustomControl : Control
??? {
??????? protected override void Render(HtmlTextWriter writer)
??????? {
??????????? base.Render(writer);
??????????? writer.WriteLine("<div>");
??????????? RenderMenuItem(writer, "網易", "http://www.163.com");
??????????? writer.Write(" | ");
??????????? RenderMenuItem(writer, "新浪", "http://www.sina.com");
??????????? writer.Write(" | ");
??????????? RenderMenuItem(writer, "MSDN", "http://msdn.microsoft.com");
??????????? writer.Write(" | ");
??????????? RenderMenuItem(writer, "ASP.NET", "http://asp.net");
??????????? writer.WriteLine("</div>");
??????? }
??????? private void RenderMenuItem(HtmlTextWriter writer, string title, string url)
??????? {
??????????? writer.Write("<span><a href=""");
??????????? writer.Write(url);
??????????? writer.Write(""">");
??????????? writer.Write(title);
??????????? writer.WriteLine("</a><span>");
??????? }
??? }
}
通過HtmlTextWriter類,我們可以在控件原有的基礎上,加入我們自己想加入的內容,注意base.Render(writer);方法,通過調用父類的Render方法,我們可以再實現父類的基礎上,加入我們額外的內容(很像設計模式里的裝飾模式)
?
控件使用方法:
??Ok,控件完成了.使用方法很簡單,只需要在頁面頭部添加如下代碼引入控件即可:
<%@ Register TagPrefix="sc" Namespace="SimpleControl" %>
在使用時就像使用用戶控件一樣,在頁面注冊完成后,系統會自動搜索命名空間內的直接或間接繼承于Control基類的控件,在前臺使用時,會自動出現智能提示:
代碼如下:
<sc:MenuCustomControl runat="server"></sc:MenuCustomControl>
頁面執行,效果如下:
?
????? Demo2:繼承現有控件
?
??????? 在很多情況下,我們并不需要重新發明輪子,我們可以通過繼承來利用現有控件的特性并額外添加我們需要的功能達到復用的目的.先看一下效果:
????
?? 通過繼承TextBox控件,并添加額外的Enable3d屬性,使現有控件擁有額外的屬性。前臺代碼摘錄如下:
???? 我是3D的:<sc:TextBox3d runat="server"></sc:TextBox3d><br />
??? 我不是:<sc:TextBox3d runat="server" Enable3D="false"></sc:TextBox3d>
?
后臺代碼如下:
??? [ToolboxData("<{0}:textbox3d runat=server></{0}:textbox3d>")]
??? public class TextBox3d : TextBox// 繼承自TextBox
??? {
??????? public TextBox3d()
??????? {
??????? Enable3D = true;
??????? }
???????
??????? public bool Enable3D
??????? {
??????????? get
??????????? {
??????????? object enable3D = ViewState["Enable3D"];
??????????? if (enable3D == null)
??????????? return false;
??????????? else
??????????? return (bool)enable3D;
??????????? }
??????????? set
??????????? {
??????????????? ViewState["Enable3D"] = value;
??????????? }
??????? }
??????? protected override void Render(HtmlTextWriter output)
??????? {
??????? if (Enable3D)
??????? output.AddStyleAttribute("FILTER", "progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true'");
??????? base.Render(output);
??????? }
??? }
?
標簽(Attribute)
也許你已經對上面代碼的[ToolboxData("<{0}:textbox3d runat=server></{0}:textbox3d>")]感到很迷惑,其實這是C#特有的一種類型。Attribute的本質是一種用于修改其他類的屬性或方法的類,其實Attribute本身就是一種類,所有的Attribute都會直接或者間接的繼承于System.Attribute,像接口的名稱往往以大寫的I開頭一樣,標簽的結尾習慣上以Attribute結尾,這樣可以增加可讀性.簡單的示例如下:
public class SampleAttribute : Attribute
??? {
}
注意,所有的標簽(Attribute)都必須被聲明為public.
在使用時可以像這樣:
public class SampleClass
??? {
??????? [SampleAttribute]
??????? public virtual void SampleMethod()
??????? {
??????????? //...
??????? }
}
?? 在應用的時候,你可以針對一個類,方法或者屬性應用好幾個Attribute.應用方法可以將這些都寫入一個方括號中,就像這樣:
[DefaultProperty("Text"), toolboxdata("<{0}:mylabel runat=server></{0}:mylabel>")]
也可以分別寫在幾個不同的方括號中,就像這樣:
??? [DefaultProperty("Text")]
??? [ToolboxData("<{0}:mylabel runat=server></{0}:mylabel>")]
Visual Studio控件開發常用的標簽(Attribute)
在利用Visual Studio進行控件開發時,利用Attribute特性可以讓空間更加智能,比如當你雙擊控件時,默認會進入控件的哪個事件的EventHandler,或者當你從ToolBox里拽過來你開發的控件,默認在前臺會生成什么樣的代碼片段等.這些都可以利用Attribute做到.這些常用的屬性都被定義在System.ComponentModel命名空間中,下面是這個命名空間里的常用的Attribute.
| Attribute | 描述 |
| BindableAttribute | Indicates whether or not a property supports two-way data binding |
| BrowsableAttribute | Indicates whether or not a property or event should be listed in a property browser |
| DefaultEvent | Specifies the name of the default event for a class |
| DescriptionAttribute | Allows the property browser to display a brief description of a property |
| ToolboxData | Specifies default values for control attributes and customizes the initial HTML content |
| EditorAttribute | Associates a UI type editor with a property |
| DefaultProperty | Specifies the name of the default property for a class |
?
?
轉載于:https://www.cnblogs.com/CareySon/archive/2009/10/02/1577402.html
總結
以上是生活随笔為你收集整理的Asp.net控件开发学习笔记(三)-控件开发基础的全部內容,希望文章能夠幫你解決所遇到的問題。