2010-11-18 99 views
2

有此中繼...迭代通過中繼

<asp:Repeater ID="myRepeater" OnItemCommand="rpt1_ItemCommand" runat="server" OnItemDataBound="rpt1_OnItemDataBound"> 
    <HeaderTemplate> 
     <table width="99%" border="0" cellpadding="0" cellspacing="0"> 
      <tr class="lgrey"> 
       <td>Default</td> 
      </tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <table> 
      <tr> 
       <td> 
        <asp:LinkButton ID="lnk1" Text="Make Default" CommandName="SetDefault" runat="server" Visible="True" CommandArgument='<%#Eval("UserID") %>' CausesValidation="false"></asp:LinkButton> 
        <asp:Label ID="label1" Text="Yes" runat="server" Visible="False"></asp:Label> 
       </td> 
      </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

我要的是,當用戶點擊任何在中繼呈現lsit的「lnk1」鏈接按鈕, 的鏈接應該被替換標籤「label1」..即當用戶點擊「Make Default」鏈接時,應該用「Yes」標籤替換

現在當我點擊2個鏈接按鈕時,兩個標籤都會顯示「Yes」因爲我只需要一個鏈接按鈕來顯示是的 即已經被套牢的物品和剩下的物品ld僅顯示「設爲默認」鏈接按鈕。

即只有一個項目應該顯示「是」標籤...現在如何迭代通過中繼器項目只設置一個項目 作爲默認值,而不是多重?

+1

我覺得首先你需要刪除'ItemTemplate'中的'table'標籤,因爲你已經在'HeaderTemplate'中有一個標籤了。 – 2010-11-18 10:13:29

+0

基本上你的問題是打開選定的標籤,你必須去掉並關閉之前打開的任何標籤。 – 2010-11-18 12:27:06

回答

6

可以遍歷轉發項集合,

protected void myRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e) 
{ 

    int selectedIndex = e.Item.ItemIndex; 
    foreach(RepeaterItem item in myRepeater.Items) 
    { 
     ((LinkButton)item.FindControl("lnk1")).Visible = (item.ItemIndex != selectedIndex); 
     ((Label)item.FindControl("label1")).Visible = (item.ItemIndex == selectedIndex); 
    } 
} 

此選項的優點是:1。沒有第二擊數據庫。

或者我會將我的邏輯放入ItemDataBound事件中,而不是將單擊的鏈接按鈕索引存儲在成員變量中,並在命令事件處理程序中調用DataBind。

private int selectedIndex = -1; 
//... 
protected void myRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e) 
    { 
     selectedIndex = e.Item.ItemIndex; 

     myRepeater.DataSource = MyGetDataMethod(); 
     myRepeater.DataBind();   

    } 

在ItemDataBound處理程序中比較當前索引與存儲索引,如果它們匹配顯示標籤。

protected void myRepeater_ItemDataBound(Object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      if(e.Item.ItemIndex == selectedIndex) 
      { 
       ((LinkButton)e.Item.FindControl("lnk1")).Visible = false; 
       ((Label)e.Item.FindControl("label1")).Visible = true; 
      } 

     } 
    } 

第二個選項的缺點是:1.數據庫中的第二個命中。 2.如果用戶點擊說第二行,並且其他用戶插入新的地址記錄,那麼當您重新綁定時,第2行可能會有所不同。此外,如果您沒有使用通過數據庫調用進行更改的訂單,那麼您存儲的selectedIndex也可能會失效。

所以總而言之,我會選擇一個,現在我已經想到了。

+0

我實現了像你說的......當我點擊「Make DEfault」鏈接按鈕時,整個中繼器消失了!和調試器不會進入中繼器的ItemDataBound事件......最新錯誤? – Serenity 2010-11-18 11:39:11

+0

好吧我只是添加了一個數據綁定調用,因爲我不知道你是如何綁定你的數據的,通常我有一個方法叫做private void BindAddress()或者其他方法,然後在那裏設置DateSource然後調用DataBind()需要重新綁定我調用BindAddress();所以你需要自己補充一點。 – 2010-11-18 12:09:28

+0

如果您使用的是SqlDataSource或ObjectDataSource,那麼只需調用DataBind()就可以工作。 – 2010-11-18 12:10:34