repeater是一个 轻量级的控件,它具有效率高,使用灵活等特点,可以根据用户的不同需求生成比较复杂的界面。以下是一个简单的例子,通过嵌套实现常见的子报表功能。同时也顺便提了一下对它的基本数据的操作。
请看示例(asp 2.0):
aspx:
< asp:Repeater ID ="rp1" runat ="server" > < HeaderTemplate > < table width ="100%" border ="1" style ="border-collapse:collapse;font-size:12px" > < tr > < th align ="center" colspan ="3" > 总门员工表 </ td > </ tr > < tr > < th > 部门编号 </ th > < th colspan ="2" > 部门名称 </ th > </ tr > </ HeaderTemplate > < ItemTemplate > < tr bgcolor ="#336699" style ="color:White" > < td > <% # Eval ( " id " ) %> </ td > < td colspan ="2" > <% # Eval ( " deptname " ) %> </ td > </ tr > < tr > < td ></ td > < td > < asp:Repeater ID ="rp2" runat ="server" DataSource ='<%#((System.Data.DataRowView)Container.DataItem).Row.GetChildRows("RelationName")% > ' OnItemCommand="rp2_ItemCommand" > < HeaderTemplate > < table width ="100%" cellspacing ="0" border ="0" cellpadding ="0" > < tr bgcolor ="#eeeef1" style ="color:black" > < td align ="center" > 删除 </ td > < td > 员工编号 </ td > < td > 员工名称 </ td > </ tr > </ HeaderTemplate > < ItemTemplate > < tr > < td align ="center" > < asp:LinkButton ID ="nkbDelete" OnClientClick ="javascript:return confirm('真的要删除吗?');" runat ="server" Text ="删除" CommandName ="delete" CommandArgument ='<%#Eval("[id]")% > '> </ asp:LinkButton > < asp:CheckBox ID ="chkSel" runat ="server" OnCheckedChanged ="CheckBoxChanged" KeyID ='<%#Eval("[id]")% > ' AutoPostBack="true" /> < asp:Button ID ="btnDelete" runat ="server" Text ="删除" CommandName ="delete" CommandArgument ='<%#Eval("[id]")% > ' /> < label id ="divDelete" style ="border:solid 1px black;width:60px;" onclick ="javascript:this.previousSibling.click();" > 删除 </ label > </ td > < td > <% #DataBinder.Eval(Container.DataItem, " [id] " ) %> < td > <% # Eval ( " [empname] " ) %> </ td > </ tr > </ ItemTemplate > < FooterTemplate > </ table > </ FooterTemplate > </ asp:Repeater > </ td > </ tr > </ ItemTemplate > < FooterTemplate > </ table > </ FooterTemplate > </ asp:Repeater >
后台程序:
protected void Page_Load( object sender, EventArgs e) { if ( ! this .IsPostBack) { this ._BindRepeater(); } } DataSet _GetDataSet() { if (ViewState[ " ds " ] != null ) { return (DataSet)ViewState[ " ds " ]; } DataSet ds = new DataSet(); DataTable dt = new DataTable(); dt.Columns.Add( " id " , typeof ( int )); dt.Columns.Add( " DeptName " ); ds.Tables.Add(dt); dt.Rows.Add( 1 , " 市场部 " ); dt.Rows.Add( 2 , " 人力资源部 " ); dt.Rows.Add( 3 , " 金融事业部 " ); dt.Rows.Add( 4 , " 通信事业部 " ); dt = new DataTable(); dt.Columns.Add( " id " , typeof ( int )); dt.Columns.Add( " deptid " , typeof ( int )); dt.Columns.Add( " empname " ); for ( int i = 0 ; i < 20 ; i ++ ) { dt.Rows.Add(i, i % 4 + 1 , " 员工 " + i.ToString()); } ds.Tables.Add(dt); /// 添加主父子关系 ds.Relations.Add( " RelationName " , ds.Tables[ 0 ].Columns[ " id " ], ds.Tables[ 1 ].Columns[ " deptId " ]); ViewState[ " ds " ] = ds; return ds; } void _SaveData(DataSet ds) { ViewState[ " ds " ] = ds; } void _DeleteData( string sID) { DataSet ds = this ._GetDataSet(); DataTable dt = ds.Tables[ 1 ]; DataRow[] row = dt.Select( " id= " + sID); if (row.Length >= 1 ) { row[ 0 ].Delete(); } this ._SaveData(ds); } void _BindRepeater() { DataSet ds = this ._GetDataSet(); this .rp1.DataSource = ds.Tables[ 0 ].DefaultView; this .rp1.DataBind(); } protected void CheckBoxChanged( object sender,EventArgs e) { CheckBox cb = (CheckBox)sender; string sID = cb.Attributes[ " KeyID " ]; this ._DeleteData(sID); this ._BindRepeater(); } protected void rp2_ItemCommand( object sender,RepeaterCommandEventArgs e) { if (e.CommandName == " delete " ) { string sID = e.CommandArgument.ToString(); this ._DeleteData(sID); this ._BindRepeater(); } }
说明:对于repleater的操作。我用了四个基本元素来实现。linkbutton 和button是一样通过指定commandname触发ItemCommand事件,并绑定了CommandArgument以便在后台事件中获取。
而CheckBox并没有commandname和CommandArgument属性,于是我给它指定了一个自定义的属性KeyID,并绑定数据的id字段。然后在checkbox的事件中获取它的属性进行相关数据操作。
label的操作,这就借用了button的事件来实现。这里label可换成任何可显示在网页中的html元素。