天天看點

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

繼續閱讀