LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#Repeater控件

admin
2017年11月16日 23:9 本文熱度 7204

Repeater?一個(gè)只會(huì)綁定數(shù)據(jù)并顯示數(shù)據(jù)的低級控件?哦~誰告訴你的?

          Repeater因?yàn)樗撵`活性和擴(kuò)展性很高,備受很多程序員青睞。我的一個(gè).net群成員曾因?yàn)楸容^Repeater和GridView而爭得面紅耳赤。我個(gè)人也是因?yàn)镚ridView有些功能無法實(shí)現(xiàn),才開始研究Repeater的。

          當(dāng)然了,我對GridView也不是太熟悉。無法客觀的比較兩者的優(yōu)劣,但因?yàn)镚ridView的高度封裝性注定了他的靈活性不及Repeater,而且Repeater做出來的東西比較“干凈”(個(gè)人覺得)。

 

          本著分享為原則,特此將自己這段時(shí)間的研究成果在年前展現(xiàn)給大家。

          這里我將整合很多Repeater的應(yīng)用,內(nèi)容長是一定的(我會(huì)盡量以最簡單明了的形式展現(xiàn),我知道讀者希望這樣。因?yàn)槲以趯W(xué)別人東西的時(shí)候也希望這樣。呵呵)。但每個(gè)內(nèi)容板塊都是可以獨(dú)立的。OK,現(xiàn)在就開始了。

        目        錄

1.Repeater的嵌套使用

2.Repeater里的按鈕單擊事件

3.獲取子Repeater里的控件

4.Repeater里單選按鈕互斥問題

5.Repeater中記錄單選按鈕選擇狀態(tài)并顯示  

6.Repeater無刷新分頁

 

1.Repeater的嵌套使用:

        參考代碼:

         前臺(tái):

         <asp:Repeater ID="questionTable" runat="server" 
         onitemdatabound="questionTable_ItemDataBound">
         <itemtemplate>                               
           <%#DataBinder.Eval (Container.DataItem ,"FID") %>   
           <asp:Repeater ID="questionOption" runat="server">
                   <itemtemplate>
         <%#DataBinder.Eval (Container.DataItem ,"OPTIONNAME") %>

                   </itemtemplate>
                </asp:Repeater>         
     </itemtemplate>
    </asp:Repeater>

如果你仔細(xì)看了下結(jié)構(gòu),你是否會(huì)思考一個(gè)問題。如何對里面嵌套的Repeater進(jìn)行數(shù)據(jù)綁定呢?

接下來看后臺(tái)代碼。

     后臺(tái):

         //用Repeater的ItemDataBound事件

          protected void questionTable_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                System.Web.UI.WebControls.Repeater questionOption = (System.Web.UI.WebControls.Repeater)e.Item.FindControl("questionOption");  //獲取嵌套中的Repeater  這是關(guān)鍵

               //接下來就可以把你的數(shù)據(jù)源給子Repeater了
                questionOption.DataSource = "......" ;    //給出要綁定的數(shù)據(jù)
                questionOption.DataBind();
            } 
        }

      小結(jié):

                什么時(shí)候用嵌套呢?當(dāng)要綁定的數(shù)據(jù)存在主子表時(shí),嵌套的Repeater就可以幫大忙了。外面的綁定主表數(shù)據(jù),里面的綁定子表數(shù)據(jù)。這樣顯示出來的情況是主表記錄顯示一行接著顯示一行子表記錄。以此類推。這是不是給人一種耳目一新的感覺呢?如果是多層嵌套也沒關(guān)系,就是不斷獲得子Repeater對象即可。

               PS:要主表記錄行下面顯示對應(yīng)主表的子表記錄,就看你給子Repeater綁定怎樣的數(shù)據(jù)源了。這里就是看你如何傳值了,給怎樣的數(shù)據(jù)源了。

 

 2.Repeater里的按鈕單擊事件

  參考代碼:

  前臺(tái):

   <asp:Button ID="delete" runat="server" Text="刪除"  OnCommand="deletequestionOption_Click"></asp:Button>

 

   后臺(tái):      
         protected void deletequestionOption_Click(object sender,CommandEventArgs e)
         {

                 if ((sender as System.Web.UI.WebControls.Button).Text == "刪除")  
                 {

                        //如何獲取控件對象呢,彩色的代碼就是獲取的方法
                  }
          }

  小結(jié):

           你想過用Repeater來編輯顯示出來的數(shù)據(jù)嗎?比如刪除或修改數(shù)據(jù)。在Repeater里面放入Button。通過OnCommand屬性來產(chǎn)生一個(gè)事件,以便達(dá)到編輯數(shù)據(jù)的效果。

 

 

 

 3.獲取子Repeater里的控件

     參考代碼:    

    前臺(tái):

 <asp:Repeater ID="questionTable" runat="server" 
        onitemdatabound="questionTable_ItemDataBound">
      <itemtemplate>                                
           <asp:Repeater ID="questionOption" runat="server">
                   <itemtemplate>
                        <asp:TextBox ID="option" runat="server" Text=''<%#DataBinder.Eval (Container.DataItem ,"OPTIONNAME") %>''></asp:TextBox>
                   </itemtemplate>
                </asp:Repeater>         
     </itemtemplate>
    </asp:Repeater>
 
后臺(tái):
//ItemCommand事件是Repeater中生成事件時(shí)激發(fā)(也就是Repeater里面的事件都會(huì)觸發(fā)此事件)
protected void questionTable_ItemCommand(object source, RepeaterCommandEventArgs e) 
{
       System.Web.UI.WebControls.TextBox Toption = null;
       string toption = null;
       
      System.Web.UI.WebControls.Repeater rptchild = (System.Web.UI.WebControls.Repeater)e.Item.FindControl("questionOption");

      //先獲取子Repeater
       for (int j = 0; j < rptchild.Items.Count; j++) //通過循環(huán)遍歷來獲取

       {
         //找到子級Repeater中的控件
         Toption = (System.Web.UI.WebControls.TextBox)rptchild.Items[j].FindControl("Toption");
         toption = Toption.Text;
       }
}

 

 

4.Repeater里單選按鈕互斥問題

      有時(shí)需要往Repeater中加入單選按鈕,當(dāng)我們加入<asp:radioButton/>這個(gè)控件后,發(fā)現(xiàn)無論自己如何設(shè)置GroupName屬性也無法使其互斥(每個(gè)單選都能被選中)。為什么會(huì)這樣呢?

     這是因?yàn)榉湃隦epeater中的單選按鈕控件自動(dòng)生成的RadioButton的GroupName不是唯一的,是依據(jù)“模板行ID+radiobutton的ID”(如:Repeater1_ctl02_CustomerRadio1,Repeater1_ctl03_CustomerRadio1)

    了解原因后,所以解決方法有兩種,一種是重寫<asp:radioButton/>控件(重寫,估計(jì)你會(huì)崩潰的)。令一種就是用<input type="radio"/>來解決。

      我選擇最簡單的第二種,真的很簡單。網(wǎng)上有一種方法也用到了<input type="radio"/>但是都用到了大量的JavaScript。很頭疼的說,都挺復(fù)雜的。

       我們知道<input type="radio"/>分組的屬性是name。所以當(dāng)你設(shè)置name屬性后,就會(huì)發(fā)現(xiàn)所有行的單選按鈕都互斥(因?yàn)樗械膎ame都相同),正好與<asp:radioButton/>走了另一個(gè)方向的極端。所以必須綜合思考下。

       我們可以通過獲取Repeater顯示行的行號來表示name,那樣就可以讓每行的單選按鈕互斥了。所以獲取行號的方法如下:

  <input type="radio" id="Radio" name="<%#Container..ItemIndex%>"/>

Container.ItemIndex是獲取Repeater的行號

如果你運(yùn)用了嵌套R(shí)epeater,而且你的單選按鈕在子Repeater。那么你的radio必須獲取父Repeater行號才行。方法如下:

<input type="radio" id="Radio" name="<%#((RepeaterItem)Container.Parent.Parent).ItemIndex%>"/>

 

 

5.Repeater中記錄單選按鈕選擇狀態(tài)并顯示

       為什么要記錄,當(dāng)你的Repeater具有分頁功能的時(shí)候。你每次點(diǎn)擊其它的頁面時(shí),會(huì)將原來已被選中的radio全部還原成為選中狀態(tài)。所以記錄下每頁的radio選擇情況就很有必要了。這里用JavaScript來解決。

       代碼如下:

      

function AddRemoveValues(oChk) {
         var HdnSelectedValues = document.getElementById("ctl00_cphPostback_HdnSelectedValues"); //這里隱藏控件的id是通過查看源碼獲得的  原因可能是因?yàn)槊總€(gè)母版也里面包含了其它自帶的隱藏控件
         var names = document.getElementsByName(oChk.name);   //這里是獲取一行中的所有單選按鈕 為下面來分別判斷那個(gè)是被選中的
         for (var i = 0; i < names.length; i++)
             if (names[i].checked) {       
                 if (HdnSelectedValues.value.indexOf(oChk.value) < 0) {  //如果隱藏控件里面有這個(gè)值了,就不進(jìn)行添加(防止用戶多次點(diǎn)擊已選中的單選按鈕)
                     HdnSelectedValues.value += "," + oChk.value;
                 }
             }
             else {
                 HdnSelectedValues.value = HdnSelectedValues.value.replace("," + names[i].value, "");  //沒有被選擇,則替換掉原來進(jìn)去的值
             }

     }

<input type="radio" id="option" onclick="AddRemoveValues(this)" value=''<%# Eval("FID") %>''  name="<%#((RepeaterItem)Container.Parent.Parent).ItemIndex%>"/>
  <asp:HiddenField ID="HdnSelectedValues" runat="server" />

延伸:

         雖然每次點(diǎn)擊的radio都被記錄了下來。那怎么樣利用這些記錄的值來顯示出來呢?下面我們就談?wù)撨@個(gè)問題。

         同樣通過激發(fā)某個(gè)事件來激發(fā)一個(gè)腳本。腳本代碼如下: 

         function SelectStatus() {
         var HdnSelectedValues = document.getElementById("<%=HdnSelectedValues.ClientID%>");
         var radios = document.getElementsByTagName("input"); //獲取當(dāng)前頁面所有的radio

         for (var i = 0; i < radios.length; i++) {
             if (radios[i].type == "radio") {
                 if (HdnSelectedValues.value.indexOf(radios[i].value) >= 0) {  //如果該單選按鈕的值在隱藏控件里則單選為被選狀態(tài)
                     radios[i].checked = true;
                 }
             }
         }
     }

PS: 值得注意的是,通過“HdnSelectedValues.ClientID”來獲取客戶端ID。比如我這里查看到源代碼中的客戶端是ID的"ctl00_cphPostback_HdnSelectedValues",這就是為什么直接獲取“HdnSelectedValues”是沒用


該文章在 2017/11/16 23:09:24 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
在线a免费播放v | 亚洲天堂在线视频 | 亚洲a∨天堂久久 | 日韩中文字幕中文有码 | 伊人久久大香线蕉综合极速 | 亚卅日韩久久影视观看 |