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 ...
       }
}
4

2 回答 2

1

至于我的理解,您每次选中复选框时都试图触发一个事件,它将根据它所属的中继器的行显示某些信息,为此,我在名为 Repeater.aspx 的页面上制作了这个示例,使用一个只会为一个复选框而不是所有复选框触发的事件:

中继器.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;

    }

}

希望这可以帮助。

于 2012-09-13T07:23:00.320 回答
0

我想我用命名容器修复它。它工作完美。

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;
        }
于 2012-09-13T12:52:13.777 回答