突然发现不知道该写点什么了,记得当初做模版控件的时候遇到一个问题,这一篇文章就介绍一下模版控件的开发吧。
我想分两块来讲:一、给现有的标准数据控件(如:Repeater )创建动态模版,二、创建可以使用模版的控件。
我想分两块来讲:一、给现有的标准数据控件(如:Repeater )创建动态模版,二、创建可以使用模版的控件。
一、给现有的标准数据控件(如:Repeater )创建模版
1、首先创建一个模版类:在这个模版中,我们要显示人员的姓名;并且人员的姓名是一个LinkButton,可以点击。
- /// <summary>
- /// Repeater模版
- /// </summary>
- internal class PersonTemplate : Control, ITemplate
- {
- string _Code;
- string _Name;
- public PersonTemplate(string Code, string Name)
- {
- _Code = Code;
- _Name = Name;
- }
- void ITemplate.InstantiateIn(Control container)
- {
- LinkButton linkButton1 = new LinkButton();
- linkButton1.ID = "lkbutton";
- linkButton1.CommandName = "SelectPerson";
- linkButton1.CausesValidation = false;
- linkButton1.DataBinding += new EventHandler(this.LinkButtonBindData);
- container.Controls.Add(new LiteralControl("<br/>"));
- container.Controls.Add(linkButton1);
- }
- void LinkButtonBindData(object sender, System.EventArgs e)
- {
- LinkButton lButton1 = sender as LinkButton;
- lButton1.CommandArgument = DataBinder.Eval(lButton1.NamingContainer, "DataItem." + _Code).ToString();
- lButton1.Text = DataBinder.Eval(lButton1.NamingContainer, "DataItem." + _Name).ToString();
- }
- }
2、然后创建一个Panel,用于存放模版
- internal class BasicPanel : Panel, INamingContainer
- {
- public BasicPanel()
- {
- }
- }
3、控件部分:
- [DefaultProperty("Text")]
- [ToolboxData("<{0}:MyRepeater runat=server></{0}:MyRepeater>")]
- [Designer(typeof(VeryCodes.Controls.Web.WebControlsDesigner))]
- public class MyRepeater : CompositeControl
- {
- [Bindable(true)]
- [Category("Appearance")]
- [DefaultValue("")]
- [Localizable(true)]
- public string Text
- {
- get
- {
- String s = (String)ViewState["Text"];
- return ((s == null) ? String.Empty : s);
- }
- set
- {
- ViewState["Text"] = value;
- }
- }
- private BasicPanel panel1;//搜索结果列表Panel
- private Repeater rp;//搜索结果列表
- private Label lb1;//选中项
- /// <summary>
- /// 绑定数据源
- /// </summary>
- [Bindable(true)]
- [Browsable(false)]
- public DataTable DataSource
- {
- get
- {
- if (ViewState[this.ClientID + "DataSource"] != null)
- {
- return (DataTable)ViewState[this.ClientID + "DataSource"];
- }
- else
- {
- return null;
- }
- }
- set
- {
- ViewState[this.ClientID + "DataSource"] = value;
- }
- }
- /// <summary>
- /// 重写Controls属性
- /// </summary>
- public override ControlCollection Controls
- {
- get
- {
- EnsureChildControls();
- return base.Controls;
- }
- }
- /// <summary>
- /// 重写Render方法
- /// </summary>
- /// <param name="writer"></param>
- protected override void Render(HtmlTextWriter output)
- {
- this.lb1.RenderControl(output);
- this.panel1.RenderControl(output);
- }
- /// <summary>
- /// 重写OnPreRender方法
- /// </summary>
- /// <param name="e"></param>
- protected override void OnPreRender(EventArgs e)
- {
- rp.DataSource = DataSource;
- rp.DataBind();
- }
- /// <summary>
- /// 重写创建子控件
- /// </summary>
- protected override void CreateChildControls()
- {
- Controls.Clear();
- CreateComponent();
- SetComponentEvent();
- }
- /// <summary>
- /// 添加子控件,并设置各个子控件的属性
- /// </summary>
- private void CreateComponent()
- {
- lb1 = new Label();
- panel1 = new BasicPanel();
- rp = new Repeater();
- lb1.ID = "lb1";
- Controls.Add(lb1);
- panel1.ID = "Panel1";
- BasicPanel progressPanel = new BasicPanel();
- if (rp.ItemTemplate == null)
- {
- rp.ItemTemplate = new PersonTemplate("Code", "Name");
- }
- rp.ItemTemplate.InstantiateIn(progressPanel);
- rp.ID = "Repeater1";
- panel1.Controls.Add(rp);
- panel1.Controls.Add(progressPanel);
- Controls.Add(panel1);
- }
- /// <summary>
- /// 添加控件按钮触发事件
- /// </summary>
- private void SetComponentEvent()
- {
- this.rp.ItemCommand += new System.Web.UI.WebControls.RepeaterCommandEventHandler(this.lkbSelect_Click);
- }
- /// <summary>
- /// 单击模版内的按钮触发事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- protected void lkbSelect_Click(object sender, RepeaterCommandEventArgs e)
- {
- if (e.Item.ItemIndex >= 0)
- {
- if (e.CommandName == "SelectPerson")
- {
- LinkButton lnkButton = e.Item.FindControl("lkbutton") as LinkButton;
- lb1.Text = "选择项是:" + lnkButton.Text;
- }
- }
- }
MyRepeater这个控件就到此为止了,需要在包含控件的页面中绑定一个数据源给它,例如
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- DataTable dt = new DataTable();
- dt.Columns.Add("Code");
- dt.Columns.Add("Name");
- DataRow dr = dt.NewRow();
- dr[0] = "001";
- dr[1] = "张三";
- dt.Rows.Add(dr);
- DataRow dr1 = dt.NewRow();
- dr1[0] = "002";
- dr1[1] = "李四";
- dt.Rows.Add(dr1);
- DataRow dr2 = dt.NewRow();
- dr2[0] = "003";
- dr2[1] = "王五";
- dt.Rows.Add(dr2);
- MyRepeater1.DataSource = dt;
- }
- }
二、创建可以使用模版的控件
我发现要想做好一件事,真的很难。最近因疲于工作,很少有时间研究技术,很长时间写不了多少。
我想这一部分就介绍一个最简单的模版控件了,我实在太懒了,只是贴点代码。
我发现要想做好一件事,真的很难。最近因疲于工作,很少有时间研究技术,很长时间写不了多少。
我想这一部分就介绍一个最简单的模版控件了,我实在太懒了,只是贴点代码。
- 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 VeryCodes.Controls.Web
- {
- [DefaultProperty("Text")]
- [ToolboxData("<{0}:TemplateTest runat=server></{0}:TemplateTest>")]
- public class TemplateTest : WebControl, INamingContainer//必须实现接口INamingContainer
- {
- private ITemplate _itemTemplate;
- //属性
- [Browsable(false)]
- [TemplateContainer(typeof(TemplateTest))]
- [PersistenceMode(PersistenceMode.InnerProperty)]
- public ITemplate ItemTemplate
- {
- get { return _itemTemplate; }
- set { _itemTemplate = value; }
- }
- protected override void CreateChildControls()
- {
- _itemTemplate.InstantiateIn(this);//创建模版控件
- }
- }
- }
有空再看看吧
转载于:https://blog.51cto.com/liweibird/211630