突然发现不知道该写点什么了,记得当初做模版控件的时候遇到一个问题,这一篇文章就介绍一下模版控件的开发吧。
我想分两块来讲:
一、给现有的标准数据控件(如: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大全
文章分类
最新评论