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元素。