轉自 : http://blog.csdn.net/friend_yutian/article/details/1469274
自定義服務器控件完全由開發人員自行設計開發,開發人員可自定義UI、功能、屬性、方法、事件等特徵,常見的自定義服務器控件分爲4種:複合控件、驗證控件、模板控件和數據綁定控件。
(1)複合控件:該類控件包含兩個或多個已存在控件。它複用了子控件提供的實現來進行控件呈現、事件處理及其他功能。
(2)驗證控件:與上文所述標準服務器控件中的驗證控件定義相同。
(3)模板控件:該類控件提供了一種稱爲模板的通用功能。模板控件本身不提供用戶界面,而是通過內聯模板提供,這意味着模板控件允許頁面開發人員自定義該控件的用戶界面。
(4)數據綁定控件:與上文所述標準服務器控件中的數據綁定控件定義相同。
本文將介紹簡單在VS環境中如何創建自定義服務器控件的過程。
實例一:創建自定義控件過程
(1)創建一個測試用Web站點應用程序
首先打開Visual Studio 2005,然後,單擊"文件"菜單下"新建網站..."項目。這時,將彈出如下圖的對話框
在此對話框中,開發人員需要選擇創建模板,位置、編程語言。如圖1所示,示例採用了ASP.NET網站模板,文件系統和C#編程語言來創建。當單擊"確定"按鈕之後,Visual Studio 2005將在本機D:/AppTest下創建一個test1文件夾。所有應用程序文件都存儲在文件夾內。默認情況下,test1文件夾內包括一個空的用於存儲應用程序數據文件的App_Data文件夾,同時還分別包括一個Default.aspx和Default.aspx.cs文件。通過這一過程,創建了一個Web站點應用程序。該Web站點將用於測試所創建的Web自定義服務器控件。
(2)添加自定義控件項目
成功創建Web控件測試項目之後,創建自定義控件項目過程如下:文件/新建項目出現如下圖所示對話框
在左側“項目類型”列表中選擇Visual C#節點下的Window,之後在右側模版列表中選擇“類庫”設置此項目的名稱和存儲位置,一般爲了便於管理建議建議將Web控件庫項目和測試站點項目存儲在同一文件夾內。
注意:在解決方案選項設置中選擇添入解決方案。
Visual Studio 2005的"解決方案資源管理器"將顯示如圖所示內容。
解決方案資源管理器中包括兩個項目。一個是前文創建的Web站點項目,另一個是名爲ClassLibrary1的Web控件庫項目,其中默認包括一個WebCustomControl1.cs文件。下面就可以開始編寫、編譯和測試自定義服務器控件了
(3)編寫控件
一個簡單的自定義控件此控件ShowDate控件功能實現顯示當前日期標籤控件,由System.Web.UI.WebControls.WebControl繼承,具有一個custom屬性,用於顯示問候信息;例如將custom屬性值設置爲"Ch",則顯示結果爲"2006年12月30日 星期六 "。
ShowDate控件的實現代碼包含在ShowDate.cs文件中。該文件源代碼如下所示。
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ClassLibrary1
{
[DefaultProperty("Custom")]
[ToolboxData("<{0}:WebCustomControl2 runat=server></{0}:WebCustomControl2>")]
public class ShowDate : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("Ch")]
[Localizable(true)]
public string Custom
{
get
{
String s = (String)ViewState["Custom"];
return ((s == null) ? "Ch" : s);
}
set
{
ViewState["Custom"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
string s;
if (Custom.Equals("Ch"))
{
s = DateTime.Now.ToString("D");
string[] x = new string[7] { "日", "一", "二", "三", "四", "五", "六" };
int n;
n = int.Parse(DateTime.Now.DayOfWeek.ToString("D"));
s += " 星期" + x[n] + " " + string.Format("{0:t}", DateTime.Now);
}
else
{
s = string.Format("{0:R}", DateTime.Now);
}
output.Write(s);
}
}
}
代碼說明:
基類說明:如果服務器控件需要呈現用戶界面(UI)元素或任何其他客戶端可見的元素,則應該從system.Web.UI.WebControls.WebControl(或派生類)派生該控件。如果控件要呈現在客戶端瀏覽器中不可見的元素(如隱藏元素或meta元素),則應從System.Web.UI.Control派生該控件。本例顯然需要呈現用戶界面元素,因此,自定義服務器控件類WelcomeLabel從WebControl基類繼承。由於WebControl類從Control派生,因此,WelcomeLabel控件則自動繼承基類提供的成員對象,這些對象多數與用戶界面元素呈現有關,例如,Font、ForeColor、BackColor、Width等等。另外,同樣也是由於從WebControl繼承,因此,WelcomeLabel控件還自動實現ASP.NET 2.0新增的主題和皮膚功能。實際上,由於WelcomeLabel控件與ASP.NET 2.0的內置服務器控件Label有着很多相似之處,因此,從功能實現的角度出發,最好的方式應該是使得WelcomeLabel控件類從Label類繼承。然而,本例爲了說明定義屬性和定義屬性元數據的實現方法,因此,從WebControl基類繼承。
屬性說明:如上原代碼所示,定義了一個Custom屬性,該屬性的設置是對當前日期顯示格式設置是中文呢還是英文。使用視圖狀態存儲Custom屬性值。使用視圖狀態保存回發間的Custom值。每次回發時,將重新創建頁並從視圖狀態還原值。如果Custom值並未存儲在視圖狀態中,則在每次回發時會將值設置爲其默認的“ch”。ViewState屬性繼承自WebControl,是保存數據值的字典。通過使用String鍵,可輸入和檢索值。本例中將"Custom"用作鍵。字典中的項被類型化爲Object,然後必須將其強制轉換爲屬性類型。通常爲了正確配置屬性,我們不僅必須編寫代碼,還要分配幾個特性。 特性(以粗體表示)定義了新控件將如何與設計器 (Visual Studio) 進行交互。Custom屬性的特性告訴 Visual Studio 如何在設計過程中處理屬性:Bindable 屬性可綁定到數據源。您可以將 屬性字段鏈接到數據庫、XML 文件或任何其他 DataSet。 Appearance 屬性將顯示在Appearance 類別下的屬性視圖中。您可以選擇想要的任何類別,包括默認類別:Appearance、Accessibility、Behavior、Data、Layout 或 Misc。只要用戶選擇了屬性的類別組織方法,屬性將會顯示在 Appearance 下。DefaultValue屬性具有一個空的默認值。。Description — 屬性說明顯示在控件列表下,並且也可能作爲工具提示出現。Localizable — 它會用發送信號的方式通知 ASP.NET 2.0 Framework 該控件包括可以針對不同語言或位置進行配置的文本屬性。
RenderContents方法說明:通常,在從WebControl派生控件並呈現單個元素時,應重寫RenderContents方法(而不是Render方法),以呈現控件標記中的內容。在呈現控件及其樣式屬性的開始標記之後,WebControl的Render方法將調用RenderContents。如果重寫Render方法以寫入內容,則控件將丟失生成到WebControl的Render方法中的樣式呈現邏輯。
在源代碼中,ShowDate控件重寫了繼承的RenderContents方法以呈現內容。傳入RenderContents方法的參數是HtmlTextWriter類型的對象,它是具有呈現標記和其他HTML(和HTML變量)標記的方法的實用工具類。
(4)編譯使用自定義控件
在編寫完成ShowDate控件的源代碼之後,接着需要編譯和測試所實現的自定義服務器控件。爲了實現這一目的,開發人員需要在測試用Web站點中引用Web控件庫項目輸出,並編寫相關代碼以便測試服務器控件。
在Web站點中實現Web控件庫項目引用的方法比較簡單。首先,右鍵單擊解決方案資源管理器中的Web站點項目名稱,在彈出的菜單中選中"添加引用..."一項。此時,將自動彈出如圖所示的窗口。
在添加引用窗口中包括5個選項卡,其中包括一個名爲"項目"的選項卡。單擊它可發現在其列表中包括一個上文創建的ClassLibrary1項目。選中該項並單擊"確定"按鈕,即可完成項目引用。
在完成項目引用後,Visual Studio 2005將自動在Web站點項目中添加一個Bin文件夾,並在其中包含了ClassLibrary1.dlll和ClassLibrary1.pdb文件。前者是控件程序集,後者中則保存着調試和項目狀態信息。這樣,Web站點就能夠順利使用HelloMyControl項目的輸出了。如下顯示了爲測試WelcomeLabel控件而創建的Default.aspx文件源代碼
<%@ Register TagPrefix="self" Namespace="ClassLibrary1" Assembly="ClassLibrary1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>測試自定義控件</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<self:ShowDate ID="WelcomeLabel1" runat="server"></self:ShowDate>
</div>
</form>
</body>
</html>
頁面利用@ Register指令將ShowDate控件引入,然後,通過<self:ShowDate>標記具體指示控件的位置,以及屬性設置等。如圖所示顯示了執行Default.aspx的頁面截圖。
小結:本文通過一個簡單的示例說明創建Asp.net服務器控件的過程,以便讀者參考。