Repeater的应用之嵌套和行操作

来源:互联网 发布:乔麦克纳利 知乎 编辑:程序博客网 时间:2024/05/21 05:57

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

原创粉丝点击