2012-09-13 21 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

相关问题