Repeater的应用之嵌套和行操作

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值