創建ASP.Net自定義控件

轉自 : 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;
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 類別下的屬性視圖中。您可以選擇想要的任何類別,包括默認類別:AppearanceAccessibilityBehaviorDataLayout 或 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文件源代碼

 

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ 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服務器控件的過程,以便讀者參考。

發佈了5 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章