最近看了MSDN關於自定義控件的介紹,根據官方的文檔,自己學着做了一個簡單的Demo給需要的朋友參考。
ASP.NET 源生的TextBox是不帶Label標簽的,這里我要實現的是創建一個帶Label標簽的TextBox,並且默認填充Text值為GUID(只讀)
實際上現在很多第三方組件都有這種控件,如Ext.Net,FineUI等等。這里只是為了學習了解自定義控件的開發。
步入正題
1.在VS2010中創建一個類庫項目,我選擇的框架是3.5。名稱“MyTextBoxControl”
2.然后新建一個類文件,名稱“MyTextBoxControl.cs”
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Permissions;
namespace MyTextBoxControl
{
[
AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal),
DefaultProperty("Text"),
ToolboxData("<{0}:MyTextBoxControl runat=\"server\"> </{0}:MyTextBoxControl>")
]
public class MyTextBoxControl : TextBox//繼承源生TextBox
{
/// <summary>
/// 為TextBox擴展的Label標簽
/// </summary>
[
Bindable(true),
Category("Appearance"),
DefaultValue("Label1:"),
Description("The control content text."),
Localizable(true)
]
public virtual string Label
{
get
{
string s = (string)ViewState["Label"];
return (s == null) ? "Label1:" : s;//如果控件Label為空,默認值為"Label1"
}
set
{
ViewState["Label"] = value;
}
}
/// <summary>
/// 重繪控件
/// </summary>
/// <param name="writer"></param>
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
System.Web.UI.WebControls.Label lable = new Label();
lable.ID = "Label1";
lable.Text = this.Label;//設置標簽文本
lable.Font.Bold = true;//設置文本顯示為粗體
lable.RenderControl(writer);//將Label輸出到控件中
this.Width = Unit.Pixel(255);//設置默認寬度
this.Text = Guid.NewGuid().ToString("N").ToUpper();//默認文本,設置默認Text值
this.ReadOnly = true;//設置Text默認只讀
base.Render(writer);//輸出控件
}
}
}
編譯項目,會在Debug目錄下生成MyTextBoxControl.dll文件
3.新建一個網站項目測試自定義控件,項目名稱“TestControl”先引用剛才的控件
在VS2010菜單上選擇“工具”》“選擇工具箱”選擇MyTextBoxControl.dll所在目錄,確定

然后在VS2010的工具欄上會出現剛才添加的控件了

接着大家就可以像其他控件一樣拖動使用了,請看下面的截圖

這里Label屬性默認為空,我們可以設置成其他值。最后上一張運行圖

我這個Demo做的比較簡單,只是入門。更復雜的官方文檔有很詳細的介紹 有興趣的朋友可以多研究下http://msdn.microsoft.com/zh-cn/library/bb386519(v=vs.90).aspx
