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. }
有空再看看吧
 
相关文章
相关标签/搜索