最近看了几个动态添加模板列的例子,自己也做一个,下面是代码:
页面代码:
View Code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="TestRepeater.Test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript" language="javascript"> function checkall(obj) { var table = document.getElementById("tableitem"); var rows = table.rows.length; var colums = table.rows[0].cells.length; var check = obj.checked; for (var i = 1; i < rows; i++) { var ctl = ""; if (i < 10) ctl = "ctl0" + i.toString(); else ctl = "ctl" + i.toString(); var cbid = obj.id.replace("ctl00", ctl); var cb = document.getElementById(cbid); if (cb != null && cb.type == "checkbox") cb.checked = check; } } function check(obj) { var table = document.getElementById("tableitem"); var rows = table.rows.length; var colums = table.rows[0].cells.length; var check = obj.checked; var arr = obj.id.split("_"); var ctl = ""; for (var i = 0; i < arr.length; i++) { if (i == (arr.length - 2)) ctl += "_ctl00"; else { if (i == 0) ctl = arr[i]; else ctl += "_" + arr[i]; } } var cbid = document.getElementById(ctl); if (cbid != null && cbid.type == "checkbox") cbid.checked = false; } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:Button runat="server" ID="btn" Text="确定" /> <table width="98%" border="1" style="border: 1px solid #000000" cellpadding="0" cellspacing="0" id="tableitem"> <asp:Repeater runat="server" ID="Repeater1"> </asp:Repeater> <asp:Repeater runat="server" ID="Repeater2"> <ItemTemplate> <tr> <td> <%#Eval("stuid") %> </td> <td> <%#Eval("stuname") %> </td> <td> <%#Eval("studepid") %> </td> <td> <asp:Button runat="server" ID="Button1" Text="确定" /> </td> </tr> </ItemTemplate> </asp:Repeater> </table> </div> </form> </body> </html>
后台代码:
View Code
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Web.UI.HtmlControls; using System.Collections.Generic; namespace TestRepeater { public partial class Test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataTable dt = GetDataTable(); Repeater1.DataSource = dt; Repeater1.DataBind(); Repeater2.DataSource = dt; Repeater2.DataBind(); } btn.Click += new EventHandler(btn_Click); } void btn_Click(object sender, EventArgs e) { DataTable dt = GetDataTable(); Repeater1.DataSource = dt; Repeater1.DataBind(); } override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // DataTable dt = GetDataTable(); List<string> idlist = new List<string>(); List<string> namelist = new List<string>(); foreach (DataColumn dc in dt.Columns) { idlist.Add(dc.ToString()); namelist.Add(dc.ToString()); } WorkFlowTraceTemplate header = new WorkFlowTraceTemplate(ListItemType.Header, idlist, namelist); WorkFlowTraceTemplate item = new WorkFlowTraceTemplate(ListItemType.Item, idlist, namelist); item.ButtonCommd += new CommandEventHandler(item_ButtonCommd); Repeater1.HeaderTemplate = header; Repeater1.ItemTemplate = item; base.OnInit(e); } void item_ButtonCommd(object sender, CommandEventArgs e) { if (e.CommandName == "btnOk") this.Page.ClientScript.RegisterStartupScript(this.GetType(), "", string.Format("<script>alert('{0}')</script>", e.CommandArgument.ToString())); DataTable dt = GetDataTable(); Repeater1.DataSource = dt; Repeater1.DataBind(); } private DataTable GetDataTable() { //表dep:depid(标识主键),depname(学院名字) //表stu:stuid(标识主键),stuname(学生名字),studepid(学院id=表dep.depid) DataTable stu = new DataTable(); DataColumn dc1 = new DataColumn("stuid", typeof(int)); DataColumn dc2 = new DataColumn("stuname", typeof(string)); DataColumn dc3 = new DataColumn("studepid", typeof(int)); stu.Columns.Add(dc1); stu.Columns.Add(dc2); stu.Columns.Add(dc3); for (int i = 0; i < 2; i++) { DataRow dr1 = stu.NewRow(); dr1["stuid"] = 1; dr1["stuname"] = "1"; dr1["studepid"] = 1; DataRow dr2 = stu.NewRow(); dr2["stuid"] = 2; dr2["stuname"] = "2"; dr2["studepid"] = 2; DataRow dr3 = stu.NewRow(); dr3["stuid"] = 3; dr3["stuname"] = "3"; dr3["studepid"] = 3; DataRow dr4 = stu.NewRow(); dr4["stuid"] = 4; dr4["stuname"] = "4"; dr4["studepid"] = 4; stu.Rows.Add(dr1); stu.Rows.Add(dr2); stu.Rows.Add(dr3); stu.Rows.Add(dr4); } return stu; } } public class WorkFlowTraceTemplate : ITemplate { public event CommandEventHandler ButtonCommd; ListItemType templateType; private List<string> ids; private List<string> names; public WorkFlowTraceTemplate(ListItemType type, List<string> ids, List<string> names) { templateType = type; this.ids = ids; this.names = names; } public void InstantiateIn(System.Web.UI.Control container) { HtmlTableRow hr = new HtmlTableRow(); switch (templateType) { case ListItemType.Header: for (int i = 0; i <= ids.Count; i++) { HtmlTableCell hc = new HtmlTableCell(); hc.Attributes.Add("Style", "border:1px solid #000000"); if (i == ids.Count) { Label lb = new Label(); lb.ID = "lb"; lb.Text = "操作"; hc.Controls.Add(lb); } else { TextBox tb = new TextBox(); CheckBox cb = new CheckBox(); cb.Attributes.Add("onclick", "checkall(this)"); cb.ID = "cb" + ids[i]; tb.ID = "tb" + ids[i]; tb.Text = names[i]; hc.Controls.Add(cb); hc.Controls.Add(tb); } hr.Cells.Add(hc); } container.Controls.Add(hr); break; case ListItemType.Item: hr.DataBinding += new EventHandler(hr_DataBinding); container.Controls.Add(hr); break; } } void hr_DataBinding(object sender, EventArgs e) { HtmlTableRow hr = (HtmlTableRow)sender; RepeaterItem container = (RepeaterItem)hr.NamingContainer; if (templateType == ListItemType.Item) { for (int i = 0; i <= ids.Count; i++) { HtmlTableCell hc = new HtmlTableCell(); hc.Attributes.Add("Style", "border:1px solid #000000"); if (i == ids.Count) { Button btn = new Button(); btn.ID = "btn"; btn.Text = "确定"; btn.Command += new CommandEventHandler(btn_Command); btn.CommandArgument = DataBinder.Eval(container.DataItem, names[0]).ToString(); btn.CommandName = "btnOk"; hc.Controls.Add(btn); } else { TextBox tb = new TextBox(); CheckBox cb = new CheckBox(); cb.ID = "cb" + ids[i]; cb.Attributes.Add("onclick", "check(this)"); tb.ID = "tb" + ids[i]; tb.Text = DataBinder.Eval(container.DataItem, names[i]).ToString(); hc.Controls.Add(cb); hc.Controls.Add(tb); } hr.Cells.Add(hc); } } } void btn_Command(object sender, CommandEventArgs e) { if (ButtonCommd != null) { ButtonCommd(sender, e); } } } }