2012-09-13 91 views
0

我有一箇中繼器,並有一個複選框。當我點擊checkedchanged事件行中的第一個信息時,會在下面顯示。但第一次點擊後,我有麻煩。有時候信息是一樣的。因爲foreach總是看到第一次點擊。例如,我檢查了第二個,我看到了信息。然後我再次點擊第二個,我看到了信息,但這次我再次點擊了第一個。 Foreach可以採取第一個複選框,最後一個複選框仍然檢查,然後再次發回第二個操作。 有什麼辦法解決這個問題嗎? 這是我的示例代碼。如何禁用第一個複選框後,其他人點擊中繼器

<asp:Repeater ID="rptInformations" runat="server"> 
    <ItemTemplate> 
     <asp:CheckBox ID="ckChoose" runat="server" OnCheckedChanged="ckChoose_CheckedChanged" AutoPostBack="true" /> 
     <div id="foo" runat="server"> ... some basic titles ...</div> 
    </ItemTemplate> 
<asp:Repeater> 
<div id="info" runat="server"> ... informations in here (textboxes, labels ..etc)</div> 

CodeBehind: 
foreach (RepeaterItem item in rptInformations.Items) 
{ 
     //CheckBox ckChoose= (CheckBox)sender; 
     CheckBox ckChoose= item.FindControl("ckChoose") as CheckBox; 
     if (cBoxChoose.Checked) 
     { 
      ... database process ... 
     } 
} 

回答

1

至於什麼我明白你想每次觸發一個事件你選中該複選框,它會根據中繼器的排它屬於顯示特定信息來,這個我已經在這個例子中頁面調用Repeater.aspx,使用一個事件,將僅針對一個複選框,而不是對所有:

Repeater.aspx:

<asp:Repeater runat="server" ID="repeater"> 
     <ItemTemplate> 
     <asp:CheckBox ID="ckChoose" runat="server" AutoPostBack="true" OnCheckedChanged="ckChoose_CheckedChanged"/> 
     <div id="foo" runat="server"> <%# Eval("Field2")%></div> 
     </ItemTemplate> 
     </asp:Repeater> 
<div id="info" runat="server"> ... informations in here (textboxes, labels ..etc)</div> 

Repeater.aspx.cs(代碼隱藏):

partial class Repeater1 : System.Web.UI.Page 
{ 

    private System.Collections.Generic.List<Item> Elements() 
    { 

     Generic.List<Item> itemList = new Generic.List<Item>(); 
     itemList.Add(new Item("1", "One")); 
     itemList.Add(new Item("2", "Two")); 

     return itemList; 

    } 


    protected void Page_Load(object sender, System.EventArgs e) 
    { 

     if (!Page.IsPostBack) { 
      this.repeater.DataSource = this.Elements(); 
      this.repeater.DataBind(); 

     } 

    } 


    protected void ckChoose_CheckedChanged(object sender, System.EventArgs e) 
    { 
     CheckBox chk = (CheckBox)sender; 
     this.info.InnerHtml = "checkbox:" + chk.ID + " foo:" + ((HtmlGenericControl)chk.Parent.FindControl("foo")).InnerText; 

    } 

} 

希望這會有所幫助。

0

我想我用namingcontainer修復它。它工作完美。

foreach (RepeaterItem item in Repeater1.Items) 
     { 
      CheckBox cBoxx = item.FindControl("ckChoose") as CheckBox; 
      current_cbId = cBoxx.NamingContainer.UniqueID.ToString(); 

      if (cBoxx.Checked) 
      { 
       ... some operations ... 

      } 

      if (cBoxChoose.NamingContainer.UniqueID.ToString() != current_cbId) 
       cBoxChoose.Checked = false; 
     } 
+0

您將該foreach放在哪個事件中? – CoderRoller

+0

複選框OnCheckedChanged事件。但我真的不確定,它的效果很好,但我對此表示懷疑。我不確定。它是健康還是最好的方式? – Kadir

+0

如果您的目標是根據中繼器中特定項目/行的值選擇chkbox,那麼我的方法是最好的,您應該嘗試一下,因爲它直接朝向一個項目,並且它會離開其餘的複選框處於原始狀態,您的迭代和驗證會消耗更多資源。順便說一句你的代碼我越來越UniqueID.ToString()等於current_cbId總是這樣它永遠不會進入如果,它是正確的? – CoderRoller

相關問題