自定義控件需要定義一個直接或間接從 Control 類派生的類,並重寫 Render 方法。在 .NET 框架中, System.Web.UI.Control 與System.Web.UI.WebControls.WebControl 兩個類是服務器控件的基類,並且定義了所有服務器控件共有的屬性、方法和事件,其中最爲重要的就是包括了控制控件執行生命週期的方法和事件,以及ID等共有屬性。 實現自定義控件,必須創建一個自定義控件,自定義控件將會編譯成 DLL文件。
首先看一下運行效果:
創建自定義服務器控件代碼
創建Discuz.Contrcol類庫文件,在其中創建Button.cs 文件
引用System.Web.UI.WebControls和System.ComponentModel命名空間
Button.cs文件部分代碼如下:
namespace Discuz.Controls
{
[DefaultEvent("Click"), DefaultProperty("Text"), ToolboxData("<{0}:Button runat=server></{0}:Button>")]
public class Button : System.Web.UI.WebControls.WebControl,IPostBackEventHandler
{
/*代碼省略*/
#region properytyButtontypeMode 按鈕樣式
public enum ButtonType
{
Normal, //普通
WithImage, //帶圖
XpStyle //不帶圖
}
public ButtonType ButtontypeMode
{
get
{
object obj = ViewState["ButtontypeMode"];
return obj == null ? ButtonType.WithImage : (ButtonType)obj;
}
set
{
ViewState["ButtontypeMode"] = value;
}
}
#endregion
/*代碼省略*/
}
}
代碼討論:
如果控件要呈現用戶界面 (UI) 元素或任何其他客戶端可見的元素,則應從 System.Web.UI.WebControls.WebControl(或派生類)派生該控件。如果控件要呈現在客戶端瀏覽器中不可見的元素(如隱藏元素或meta 元素),則應從System.Web.UI.Control 派生該控件。
DefaultEventAttribute
設計時屬性。
在可視化設計器中指定控件的默認事件。在許多可視化設計器中,頁開發人員在設計圖面上雙擊控件時,將打開代碼編輯器,同時將光標定位到默認事件的事件處理程序中。
示例:DefaultEvent("Click")
DefaultPropertyAttribute
設計時屬性。
當頁開發人員在設計圖面上選擇控件時,此屬性 (Attribute) 中指定的屬性 (Property) 將在可視化設計器的屬性 (Property) 瀏覽器中突出顯示此默認屬性。
示例:[DefaultProperty("Text")]
ToolboxDataAttribute
設計時屬性。
指定從工具箱創建控件時可視化設計器爲標記創建的標記格式。
示例:ToolboxData("<{0}:Button runat=server></{0}:Button>")
更多關於自定義服務器控件的元數據屬性的介紹請參考:http://msdn.microsoft.com/zh-cn/library/ms178658(v=vs.90).aspx
ViewState
獲取狀態信息的字典,這些信息使您可以在同一頁的多個請求間保存和還原服務器控件的視圖狀態。命名空間:System.Web.UI
示例:
public String Text
{
get
{
object o = ViewState["text"];
return (o == null)? String.Empty : (string)o;
}
set
{
ViewState["Text"] = value;
}
}
按鈕上顯示的文字
#region Property Text 按鈕文字
/// <summary>
/// 按鈕文字
/// </summary>
[Bindable(true), Category("Appearance"), DefaultValue(" 提 交 ")]
public string Text
{
get
{
object obj = ViewState["ButtonText"];
return obj == null ? " 提 交 " : (string)obj;
}
set
{
ViewState["ButtonText"] = value;
}
}
#endregion
代碼討論:
BindableAttribute
設計時屬性。
指定將數據綁定到屬性是否有意義。在可視化設計器中,屬性瀏覽器可以在對話框中顯示控件的可綁定屬性。(例如,在 Visual Studio 中,可綁定屬性顯示在“數據綁定”對話框中。) 如果屬性 (Property) 沒有使用此屬性 (Attribute) 標記,則屬性 (Property) 瀏覽器會推斷其值爲
Bindable(false)。
示例:[Bindable(true)]
CategoryAttribute
設計時屬性。
指定如何在可視化設計器的屬性瀏覽器中對屬性進行分類。例如,當頁開發人員在屬性瀏覽器中使用分類視圖時,Category("Appearance") 將告知屬性瀏覽器在“外觀”類別中顯示屬性。可以指定一個對應於屬性瀏覽器中的現有類別的字符串參數,也可以創建自己的類別。
示例:[Category("Appearance")]
DefaultValueAttribute
設計時屬性。
指定屬性的默認值。此值應與從屬性訪問器 (getter) 返回的默認值相同。在有些可視化設計器(如 Visual Studio)中,DefaultValueAttribute 屬性允許頁開發人員使用快捷菜單上的“重置”命令將屬性值重置爲其默認值。
示例:DefaultValue(" 提 交 ")
圖片按鈕鏈接
#region Property ButtonImgUrl 圖版按鈕鏈接
/// <summary>
/// 圖片按鈕鏈接
/// </summary>
[Description("圖版按鈕鏈接"), DefaultValue("../images/submit.gif")]
public string ButtonImgUrl
{
get
{
object obj = ViewState["ButtonImgUrl"];
return obj == null ? "../images/submit.gif" : (string)obj;
}
set
{
ViewState["ButtonImgUrl"] = value;
}
}
#endregion
代碼討論:
DescriptionAttribute
設計時屬性。
指定屬性的簡短描述。在可視化設計器(如 Visual Studio)中,屬性瀏覽器通常在窗口底部顯示選定的屬性的描述。
示例:Description("圖版按鈕鏈接")
DefaultValueAttribute
設計時屬性。
指定屬性的默認值。此值應與從屬性訪問器 (getter) 返回的默認值相同。在有些可視化設計器(如 Visual Studio)中,DefaultValueAttribute 屬性允許頁開發人員使用快捷菜單上的“重置”命令將屬性值重置爲其默認值。
示例:DefaultValue("../images/submit.gif")
背景圖片路徑
#region Property XpBGImgFilePath XP背景圖片路徑
/// <summary>
/// XP背景圖片路徑
/// </summary>
[Description("圖版按鈕鏈接"), DefaultValue("../images/")]
public string XpBGImgFilePath
{
get
{
object obj = ViewState["XpBGImgFilePath"];
return obj == null ? "../images/" : (string)obj;
}
set
{
ViewState["XpBGImgFilePath"] = value;
}
}
#endregion
代碼討論:
由於關於此屬性的知識點已在前面屬性中進行了講解,這裏就不再贅述,下面此情況同理
要加載的客戶端腳本內容
#region Property ScriptContent 要加載的客戶端腳本內容
/// <summary>
/// 要加載的客戶端腳本內容
/// </summary>
[Description("圖版按鈕鏈接"), DefaultValue("../images/")]
public string ScriptContent
{
get
{
object obj = ViewState["ScriptContent"];
return obj == null ? "" : (string)obj;
}
set
{
ViewState["ScriptContent"] = value;
}
}
#endregion