ASP.NET自定義控件開發系列(三)

忽然發現不知道該寫點什麼了,記得當初作模版控件的時候遇到一個問題,這一篇文章就介紹一下模版控件的開發吧。
我想分兩塊來說:1、給現有的標準數據控件(如:Repeater )建立動態模版,2、建立能夠使用模版的控件。
1、給現有的標準數據控件(如:Repeater )建立模版
一、首先建立一個模版類:在這個模版中,咱們要顯示人員的姓名;而且人員的姓名是一個LinkButton,能夠點擊。
  1. /// <summary>
  2.     /// Repeater模版
  3.     /// </summary>
  4.     internal class PersonTemplate : Control, ITemplate
  5.     {
  6.         string _Code;
  7.         string _Name;
  8.         public PersonTemplate(string Code, string Name)
  9.         {
  10.             _Code = Code;
  11.             _Name = Name;
  12.         }
  13.         void ITemplate.InstantiateIn(Control container)
  14.         {
  15.             LinkButton linkButton1 = new LinkButton();
  16.             linkButton1.ID = "lkbutton";
  17.             linkButton1.CommandName = "SelectPerson";
  18.             linkButton1.CausesValidation = false;
  19.             linkButton1.DataBinding += new EventHandler(this.LinkButtonBindData);
  20.             container.Controls.Add(new LiteralControl("<br/>"));
  21.             container.Controls.Add(linkButton1);
  22.         }
  23.         void LinkButtonBindData(object sender, System.EventArgs e)
  24.         {
  25.             LinkButton lButton1 = sender as LinkButton;
  26.             lButton1.CommandArgument = DataBinder.Eval(lButton1.NamingContainer, "DataItem." + _Code).ToString();
  27.             lButton1.Text = DataBinder.Eval(lButton1.NamingContainer, "DataItem." + _Name).ToString();
  28.         }
  29.     }
二、而後建立一個Panel,用於存放模版
  1. internal class BasicPanel : Panel, INamingContainer
  2.     {
  3.         public BasicPanel()
  4.         {
  5.         }
  6.     }
三、控件部分:
  1. [DefaultProperty("Text")]
  2.     [ToolboxData("<{0}:MyRepeater runat=server></{0}:MyRepeater>")]
  3.     [Designer(typeof(VeryCodes.Controls.Web.WebControlsDesigner))]
  4.     public class MyRepeater : CompositeControl
  5.     {
  6.         [Bindable(true)]
  7.         [Category("Appearance")]
  8.         [DefaultValue("")]
  9.         [Localizable(true)]
  10.         public string Text
  11.         {
  12.             get
  13.             {
  14.                 String s = (String)ViewState["Text"];
  15.                 return ((s == null) ? String.Empty : s);
  16.             }
  17.             set
  18.             {
  19.                 ViewState["Text"] = value;
  20.             }
  21.         }
  22.         private BasicPanel panel1;//搜索結果列表Panel
  23.         private Repeater rp;//搜索結果列表
  24.         private Label lb1;//選中項
  25.         /// <summary>
  26.         /// 綁定數據源
  27.         /// </summary>
  28.         [Bindable(true)]
  29.         [Browsable(false)]
  30.         public DataTable DataSource
  31.         {
  32.             get
  33.             {
  34.                 if (ViewState[this.ClientID + "DataSource"] != null)
  35.                 {
  36.                     return (DataTable)ViewState[this.ClientID + "DataSource"];
  37.                 }
  38.                 else
  39.                 {
  40.                     return null;
  41.                 }
  42.             }
  43.             set
  44.             {
  45.                 ViewState[this.ClientID + "DataSource"] = value;
  46.             }
  47.         }
  48.         /// <summary>
  49.         /// 重寫Controls屬性
  50.         /// </summary>
  51.         public override ControlCollection Controls
  52.         {
  53.             get
  54.             {
  55.                 EnsureChildControls();
  56.                 return base.Controls;
  57.             }
  58.         }
  59.         /// <summary>
  60.         /// 重寫Render方法
  61.         /// </summary>
  62.         /// <param name="writer"></param>
  63.         protected override void Render(HtmlTextWriter output)
  64.         {
  65.             this.lb1.RenderControl(output);
  66.             this.panel1.RenderControl(output);
  67.         }
  68.         /// <summary>
  69.         /// 重寫OnPreRender方法
  70.         /// </summary>
  71.         /// <param name="e"></param>
  72.         protected override void OnPreRender(EventArgs e)
  73.         {
  74.             rp.DataSource = DataSource;
  75.             rp.DataBind();
  76.         }
  77.         /// <summary>
  78.         /// 重寫建立子控件
  79.         /// </summary>
  80.         protected override void CreateChildControls()
  81.         {
  82.             Controls.Clear();
  83.             CreateComponent();
  84.             SetComponentEvent();
  85.         }
  86.         /// <summary>
  87.         /// 添加子控件,並設置各個子控件的屬性
  88.         /// </summary>
  89.         private void CreateComponent()
  90.         {
  91.             lb1 = new Label();
  92.             panel1 = new BasicPanel();
  93.             rp = new Repeater();
  94.             lb1.ID = "lb1";
  95.             Controls.Add(lb1);
  96.             panel1.ID = "Panel1";
  97.             BasicPanel progressPanel = new BasicPanel();
  98.             if (rp.ItemTemplate == null)
  99.             {
  100.                 rp.ItemTemplate = new PersonTemplate("Code", "Name");
  101.             }
  102.             rp.ItemTemplate.InstantiateIn(progressPanel);
  103.             rp.ID = "Repeater1";
  104.             panel1.Controls.Add(rp);
  105.             panel1.Controls.Add(progressPanel);
  106.             Controls.Add(panel1);
  107.         }
  108.         /// <summary>
  109.         /// 添加控件按鈕觸發事件
  110.         /// </summary>
  111.         private void SetComponentEvent()
  112.         {
  113.             this.rp.ItemCommand += new System.Web.UI.WebControls.RepeaterCommandEventHandler(this.lkbSelect_Click);
  114.         }
  115.         /// <summary>
  116.         /// 單擊模版內的按鈕觸發事件
  117.         /// </summary>
  118.         /// <param name="sender"></param>
  119.         /// <param name="e"></param>
  120.         protected void lkbSelect_Click(object sender, RepeaterCommandEventArgs e)
  121.         {
  122.             if (e.Item.ItemIndex >= 0)
  123.             {
  124.                 if (e.CommandName == "SelectPerson")
  125.                 {
  126.                     LinkButton lnkButton = e.Item.FindControl("lkbutton") as LinkButton;
  127.                     lb1.Text = "選擇項是:" + lnkButton.Text;
  128.                 }
  129.             }
  130.         }
MyRepeater這個控件就到此爲止了,須要在包含控件的頁面中綁定一個數據源給它,例如
  1. protected void Page_Load(object sender, EventArgs e)
  2.     {
  3.         if (!IsPostBack)
  4.         {
  5.             DataTable dt = new DataTable();
  6.             dt.Columns.Add("Code");
  7.             dt.Columns.Add("Name");
  8.             DataRow dr = dt.NewRow();
  9.             dr[0] = "001";
  10.             dr[1] = "張三";
  11.             dt.Rows.Add(dr);
  12.             DataRow dr1 = dt.NewRow();
  13.             dr1[0] = "002";
  14.             dr1[1] = "李四";
  15.             dt.Rows.Add(dr1);
  16.             DataRow dr2 = dt.NewRow();
  17.             dr2[0] = "003";
  18.             dr2[1] = "王五";
  19.             dt.Rows.Add(dr2);
  20.             MyRepeater1.DataSource = dt;
  21.         }
  22.     }
2、建立能夠使用模版的控件
我發現要想作好一件事,真的很難。最近因疲於工做,不多有時間研究技術,很長時間寫不了多少。
我想這一部分就介紹一個最簡單的模版控件了,我實在太懶了,只是貼點代碼。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Text;
  5. using System.Web;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. namespace VeryCodes.Controls.Web
  9. {
  10.     [DefaultProperty("Text")]
  11.     [ToolboxData("<{0}:TemplateTest runat=server></{0}:TemplateTest>")]
  12.     public class TemplateTest : WebControl, INamingContainer//必須實現接口INamingContainer
  13.     {
  14.         private ITemplate _itemTemplate;
  15.         //屬性
  16.       [Browsable(false)]
  17.         [TemplateContainer(typeof(TemplateTest))]
  18.         [PersistenceMode(PersistenceMode.InnerProperty)]
  19.         public ITemplate ItemTemplate
  20.         {
  21.             get { return _itemTemplate; }
  22.             set { _itemTemplate = value; }
  23.         }
  24.         protected override void CreateChildControls()
  25.         {
  26.             _itemTemplate.InstantiateIn(this);//建立模版控件
  27.         }
  28.     }
  29. }
有空再看看吧
 
相關文章
相關標籤/搜索