C#編寫自定義控制項

學習自定義控制項的開發不僅可以使你開發出更靈活的系統更重要的是它可以使你加深對已有伺服器控制項的理解,得以更靈活的應用。

較之於asp,asp.NET提供了更強大的功能,我比較喜歡它的代碼分離技術和對諸如C#、VB.net等強類型語言的使用,這是從開發者的角度來看的,從用戶的角度來看,會覺得它速度更快,運行更穩定,安全性也更高。不管怎麼說,新技術的產生總會使許多人感到高興,不過對開發者來說,壞消息是他們需要學習更多新的知識。

Asp.Net有了很多的改變,比如你可能會發現供我們操作的元素也和以前有了很大的不同,原來標準的HTML元素變成了現在的伺服器控制項,所謂伺服器控制項,就是在伺服器上運行,並可以映射到所有瀏覽器支持的標準 HTML 標記的控制項,在你的web窗體中,凡是包含 runat="server" 屬性聲明的元素都叫做伺服器控制項(在VS.Net中的設計頁面中,用一個小小的綠色箭頭表示),你可以用原有的HTML元素並加上runat=」server」屬性使其變為一個伺服器控制項,這叫做HtmlControls,它可以直接映射到標準HTML標記;也可以使用.Net提供的全新的WebControls,它比前者更抽象,功能也更加強大。不管採用哪一類控制項,runat=」server」屬性都將會使你可以以編程方式訪問這些元素。

這很容易理解,伺服器控制項就是在伺服器端運行的控制項,經過伺服器端某些程序的解析再生成標準的HTML代碼顯示在我們的瀏覽器上,事實上,Web Form之所以可以提供最大可能的瀏覽器兼容性也是基於此理。與通常的理解稍稍有些不同,在asp.net中,一個頁面(Page),一個驗證控制項,一個用戶控制項(User Control),都可以看作是一個獨立的控制項,它來自於其它控制項的組合。除了使用.Net提供的一系列控制項外,你還可以到網上找一些免費的控制項,www.asp.net中的Control Gallery一欄就收集了很多常用的Control。

在asp.net中,(傳統意義上)可供你開發的控制項實際上有兩種:Custom Control 和 User Control。Custom Control 是縱向的,是對系統本身控制項的繼承和擴充,在程序中以DLL文件形式存在,User Control 則是橫向的,是對系統本身控制項的組合,在系統中以.ascx為後綴名。這兩種控制項功能相同,都可以為開發人員提供可復用的可視化UI組件,相比之下前者具有更大的靈活性,同時開發起來比較複雜,而後者容易開發,但可重用性就比較差。一般來說用戶會先用User Control來開發,只有當其不堪重用的時候才轉而使用Custom Control。事實上,用戶自己開發Custom Control並不是一件很困難的事,只需要定義一個直接或間接從Control 派生的類並重寫它的 Render 方法即可,System.Web.UI.Control與System.Web.UI.WebControls.WebControl兩個類是伺服器控制項的基類。 Control 類定義了所有伺服器控制項共有的屬性、方法和事件。其中包括控制控制項執行生命周期的方法和事件,以及 ID、UniqueID、Parent、ViewState 和 Controls(子控制項集合)等屬性。Control 沒有用戶界面 (UI) 特定的任何功能。如果創作的控制項沒有提供 UI,或者組合了其他呈現其自己的 UI 的控制項,則從 Control 派生。 WebControl 類是從 Control 派生的,並為 UI 功能提供附加的屬性和方法。這些屬性包括 ForeColor、BackColor、Font、BorderStyle、Height 和 Width。WebControl 是 ASP.NET 中 Web 伺服器控制項系列的基類。如果控制項呈現 UI,則從 WebControl 派生。可以重寫從基類繼承的屬性、方法和事件,並可以將新的屬性、方法和事件添加到自定義控制項中,所前所述,我們使用重寫Render方法來實現對HTML代碼的輸出。Render 方法採用 System.Web.UI.HtmlTextWriter 類型的參數。控制項要發送到客戶端的 HTML 作為字元串參數傳遞到 HtmlTextWriter 的 Write 方法。下面我們使用VS.Net來開發一個簡單的自定義控制項(使用VS.Net的原因是為了方便開發者調試,在正式開發中我們經常使用的也是VS.Net)。首先新建一個空白解決方案,然後為其添加兩個項目,一個名為MyControls的Web控制項庫項目和一個叫做Web的Web應用程序項目,後者用於測試我們開發出的控制項。在Web項目上點擊右鍵,選擇依賴項,使項目Web取決於MyControls,接著再為Web項目添加MyControls的引用(編譯成的MyControls.dll文件後被copy到Web目錄的Bin文件夾下,你可以在任何地方使用這個MyControls.dll文件)。在MyControls項目中添加一個Web自定義控制項並命名為MyControl.cs,接著在Web項目中的WebForm1.aspx文件首行添加如下代碼(用於向頁面註冊此控制項):<%@ Register TagPrefix="ccs" Namespace="MyControls" Assembly="MyControls" %>在<Form>標記之間添加如下代碼(添加此控制項到頁面上):<ccs:MyControl id="Control1" runat="server" Text="Hello World"></ccs:MyControl>OK,一個帶有Text屬性的自定義控制項已經完成了,現在就可以運行它並觀看效果了。這個控制項的結果僅僅是將一行文本輸出到瀏覽器並顯示出來,但是我們平時所用到的控制項,小到如Label,大到如DataGrid,都是基於這一原理開發出來的。接著我們看一下這個自定義控制項源文件(MyControl.cs)的組成。using System;using System.Web.UI;using System.Web.UI.WebControls;using System.ComponentModel;namespace MyControls{ // Attribute DefaultProperty指定組件的默認屬性,ToolboxData指定當從IDE工具中的 //工具箱中拖動自定義控制項時為它生成的默認標記 [DefaultProperty("Text"), ToolboxData("<{0}:MyControl runat=server></{0}:MyControl>")] //類MyControl派生自WebControl public class MyControl : System.Web.UI.WebControls.WebControl { private string text;//Attribute Bindable指定屬性是否通常用於綁定//Category指定屬性或事件將顯示在可視化設計器中的類別//DefalutValue用於指定屬性的默認值 [Bindable(true), Category("Appearance"), DefaultValue("")] public string Text { get { return text; } set { text = value; } } //重寫WebControl的Render方法,採用HtmlTextWriter類型的參數 protected override void Render(HtmlTextWriter output) { //發送屬性Text的值到瀏覽器 output.Write(Text); } }}

現在我們略略修改一下Render方法的輸出值,試著為輸出文本加上標籤Span:output.Write("<span>"+Text+"</span>");也可以用標籤修飾文本的顯示:output.Write("<span><b>"+Text+"</b></span>");也可以添加更多的屬性來控制文本的輸出,在此基礎上就可以創作出豐富的UI控制項。有時候針對不同的項目我們可能要開發不同用項的伺服器控制項,比如說特殊用途的DataGrid;有時候我們可能會被要求開發一些常用的控制項,比如說像Chart、TreeView、Menu等這一類通用控制項。針對於此,你可能會有四種不同的選擇:創建一個用戶控制項,用它封裝其用戶界面 (UI) 的伺服器控制項,無需編寫任何額外的代碼。開發一個編譯控制項,該控制項結合了兩個或多個現有控制項的功能。例如,需要一個封裝一個按鈕和一個文本框的控制項。可以使用複合控制項來完成。從現有控制項中派生並重寫其屬性、方法或事件來自定義現有控制項。從基本控制項類之一派生來創建自定義控制項。以上四種方式從難度上來講順序依次複雜,使用原則如前所述,只有當前者達不到項目要求時才需考慮後者,一般來說,開發用戶控制項所使用的編程模型與後三個有著很大不同,它更類似於Asp.Net頁的開發。本文我們簡單的描述了自定義控制項的定義及使用情況,並且用VS.Net實際開發了一個(用於顯示一串文本欄位的)屬於自己的自定義控制項,你可以在自己的項目中使用它,也可以將其發布到互聯網上供人們下載使用,當然現在控制項MyControl所具的功能還不足以吸引用戶去使用,接下來我們會討論關於自定義控制項的一些高級議題,包括定義屬性、維護狀態、處理回發數據、模版與數據綁定等內容以提高它的可用性。

推薦閱讀:

WPF控制項簡單總結(轉載)
C#中利用LightningChart繪製曲線(及LightningChart介紹)
淺述Excel中控制項的用法
C# 控制項縮寫大全+命名規範+示例
Camera Raw控制項功能全解

TAG:控制 | 定義 | 控制項 | 自定義 |