突然发现不知道该写点什么了,记得当初做模版控件的时候遇到一个问题,这一篇文章就介绍一下模版控件的开发吧。
我想分两块来讲:
一、给现有的标准数据控件(如:Repeater )创建动态模版
二、创建可以使用模版的控件。
一、给现有的标准数据控件(如:Repeater )创建模版
1、首先创建一个模版类:在这个模版中,我们要显示人员的姓名;并且人员的姓名是一个LinkButton,可以点击。
//Repeater模版 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(" ")); 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>")] [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;//选中项 //绑定数据源 [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; } } //重写Controls属性 public override ControlCollection Controls { get { EnsureChildControls(); return base.Controls; } } //重写Render方法 protected override void Render(HtmlTextWriter output) { this.lb1.RenderControl(output); this.panel1.RenderControl(output); } //重写OnPreRender方法 protected override void OnPreRender(EventArgs e) { rp.DataSource = DataSource; rp.DataBind(); } //重写创建子控件 protected override void CreateChildControls() { Controls.Clear(); CreateComponent(); SetComponentEvent(); } //添加子控件,并设置各个子控件的属性 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); } //添加控件按钮触发事件 private void SetComponentEvent() { this.rp.ItemCommand += new System.Web.UI.WebControls.RepeaterCommandEventHandler(this.lkbSelect_Click); } //单击模版内的按钮触发事件 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>")] 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);//创建模版控件 } } }
有空再看看吧
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论