自定义控件(模板+数据绑定)
先说说模板
1<asp:datagrid id="mydg" runat="server">
2<columns>
3<asp:button id="Button1" runat="server">
4</asp:button></columns>
5</asp:datagrid>
这个
1<columns>就是个模板标记,在自定义控件中可以自己任意设置这个<columns>,可以是<overred>...
2开始:
3新建个类
4MyItemTemPlateC.cs
5using System;
6using System.Collections;
7using System.ComponentModel;
8using System.Data;
9using System.Drawing;
10using System.Web;
11using System.Web.SessionState;
12using System.Web.UI;
13using System.Web.UI.WebControls;
14using System.Web.UI.HtmlControls;
15
16
17namespace WebApp3
18{
19/// <summary>
20/// MyTemplateC 的摘要说明。
21/// </summary>
22[ParseChildren(true)]
23public class MyTemplateC: Control,INamingContainer
24{
25
26private ITemplate itemPlate;
27[TemplateContainer(typeof(MyContainer))]
28public ITemplate ItemTemplate
29{
30get{return itemPlate;}
31set{itemPlate=value;}
32}
33
34// private string text;
35// public string Text
36// {
37// get{return text;}
38// set{text=value;}
39// }
40private IEnumerable dataSource;
41public IEnumerable DaTaSource
42{
43get{return this.dataSource;}
44set{this.dataSource=value;}
45}
46
47protected override void OnDataBinding(EventArgs e)
48{
49HasCreatDataSource();
50//this.EnsureChildControls();//确定是否包含子控件,否则创建
51/// <summary>
52/// 为确保直到再次发生数据绑定时才创建子控件,在创建对象并将它添加到控件的
53///ControlCollection 对象之后,将 ChildControlsCreated 属性设置为 true。
54/// </summary>
55this.ChildControlsCreated=true;
56base.OnDataBinding (e);
57}
58
59
60protected override void CreateChildControls()
61{
62if(itemPlate!=null)
63{
64
65int itemCount=(int)ViewState["_itemCount"];
66for(int i=0;i<itemcount;i++) <summary="" else="" itemplate.instantiatein(mycontainer);="" literalcontrol("="" mycontainer="new" mycontainer();="" no="" template"));="" this.controls.add(mycontainer);="" this.controls.add(new="" {="" }="" 当由类实现时,创建子控件对象="">
67/// 方法HasCreatDataSource作用是记录子控件的数目以及实例化子控件
68///
69private void HasCreatDataSource()
70{
71if(itemPlate!=null)
72{
73int itemCount=0;//记录共创建多少个子控件
74foreach(string s in dataSource)
75{
76MyContainer myContainer=new MyContainer();
77myContainer.MyText(s);
78itemPlate.InstantiateIn(myContainer);//当由类实现时,创建子控件对象
79this.Controls.Add(myContainer);
80itemCount++;
81}
82ViewState["_itemCount"]=itemCount;
83}
84else
85{
86this.Controls.Add(new LiteralControl(" NO TEMPLATE"));
87}
88
89}
90}
91
92
93public class MyContainer:Control,INamingContainer
94{
95private string text;
96public string Text
97{
98get{return text;}
99set{text=value;}
100}
101
102public MyContainer()
103{
104//this.text=msg;
105}
106public string MyText(string msg)
107{
108this.text=msg;
109return this.text;
110
111}
112
113}
114
115}</itemcount;i++)></overred></columns></columns>