C# 动态生成的复选框在回发时始终选中==False

C# 动态生成的复选框在回发时始终选中==False,c#,asp.net,checkbox,webforms,C#,Asp.net,Checkbox,Webforms,我有一个asp:panel,点击一个按钮,我就可以动态添加一些复选框 在另一个按钮上单击,我需要查看这些复选框并检查它们是否被选中 这是我之前发布的一个问题的后续问题。第一个问题是我在回发时根本找不到动态生成的控件 现在,我可以找到他们了。问题是,Checked属性始终为false,尽管选中了UI上的复选框 带有复选框所在面板的标记,以及两个按钮: <asp:Panel runat="server" ScrollBars="Vertical" ID="pnlEmailCheckboxes"

我有一个
asp:panel
,点击一个按钮,我就可以动态添加一些复选框

在另一个按钮上单击,我需要查看这些复选框并检查它们是否被选中

这是我之前发布的一个问题的后续问题。第一个问题是我在回发时根本找不到动态生成的控件

现在,我可以找到他们了。问题是,
Checked
属性始终为false,尽管选中了UI上的复选框

带有复选框所在面板的标记,以及两个按钮:

<asp:Panel runat="server" ScrollBars="Vertical" ID="pnlEmailCheckboxes" Height="150">
    <br/>
    <asp:CheckBox runat="server" Text="Other" ID="cbOtherEmail"/>
    <asp:TextBox ID="txtOtherEmail" runat="server" Style="width: 270px;" CssClass="textbox-default"></asp:TextBox>
    <br/>
</asp:Panel>
<asp:LinkButton ID="btnSendEmail" Text="<span>Send Email</span>" runat="server" CssClass="page-footer-button-highlight" OnClick="btnSendEmail_Click"></asp:LinkButton>
<asp:LinkButton ID="btnCloseEmail" Text="<span>Close</span>" runat="server" CssClass="page-footer-button" CausesValidation="false" OnClick="btnCloseEmail_OnClick"></asp:LinkButton>



生成文本框的事件:

protected void btnEmail_Click(object sender, EventArgs e)
{
    List<CheckBox> cbList = new List<CheckBox>();
    for (int i = 0; i < 10; i++)
    {
        CheckBox cb = new CheckBox();
        cb.Text = "text" + i;
        cb.ID = Guid.newGuid().ToString();
        cb.ClientIDMode = ClientIDMode.Static;
        pnlEmailCheckboxes.Controls.AddAt(0, cb);
        pnlEmailCheckboxes.Controls.AddAt(0, new LiteralControl("<br/>"));
        cbList.Add(cb);
    }

    Session["checkboxes"] = cbList;
    mpeEmail.Show();
}
protectedvoid btnEmail\u单击(对象发送方,事件参数e)
{
List cbList=新列表();
对于(int i=0;i<10;i++)
{
复选框cb=新复选框();
cb.Text=“Text”+i;
cb.ID=Guid.newGuid().ToString();
cb.clientmode=clientmode.Static;
pnleMailCheckbox.Controls.AddAt(0,cb);
pnlEmailCheckboxes.Controls.AddAt(0,新的LiteralControl(“
”); cbList.Add(cb); } 会话[“复选框”]=cbList; mpemail.Show(); }
尝试检索文本框的按钮(不起作用):

protectedvoid btnSendEmail\u单击(对象发送者,事件参数e)
{
//电子邮件收件人
List emailRecipients=新列表();
List cbList=(List)会话[“复选框”];
foreach(cbList中的复选框cb)
{
CheckBox cbClient=(CheckBox)pnlemailcheckbox.FindControl(cb.ClientID);//我还尝试通过cb.ID查找它
//总是假的
如果(cbClient.Checked)emailRecipients.Add(cb.Text.Trim());
}
//我也尝试过,它不包含动态生成的复选框
//var cbControls=pnlemailcheckbox.Controls.OfType();
}
编辑:

客户端html甚至显示了与我正在搜索的ID匹配的正确ID

<input id="00e3a485-2083-4ef8-810b-6ed4fb1f62f9" type="checkbox" name="ctl00$Body$00e3a485-2083-4ef8-810b-6ed4fb1f62f9">

每次回发时都需要重新创建动态控件(这已经发生了,因为我是在页面
OnInit
函数中创建它们的)

但是,问题是我使用了一个新生成的Guid作为每个控件的ID。这导致每个回发上重新生成的控件未映射到来自旧控件的postdata

protected void btnEmail_Click(object sender, EventArgs e)
{
    List<CheckBox> cbList = new List<CheckBox>();
    for (int i = 0; i < 10; i++)
    {
        CheckBox cb = new CheckBox();
        cb.Text = "text" + i;

        //cb.ID = Guid.newGuid().ToString(); //don't do this.
        cb.ID = "checkbox" + i; // <------ do this, have a consistent ID

        cb.ClientIDMode = ClientIDMode.Static;
        pnlEmailCheckboxes.Controls.AddAt(0, cb);
        pnlEmailCheckboxes.Controls.AddAt(0, new LiteralControl("<br/>"));
        cbList.Add(cb);
    }

    Session["checkboxes"] = cbList;
    mpeEmail.Show();
}
protectedvoid btnEmail\u单击(对象发送方,事件参数e)
{
List cbList=新列表();
对于(int i=0;i<10;i++)
{
复选框cb=新复选框();
cb.Text=“Text”+i;
//cb.ID=Guid.newGuid().ToString();//不要这样做。

cb.ID=“checkbox”+i;//我更喜欢使用复选框的重复器,而不是动态添加它们。在这种情况下,您必须在回发(OnLoad)后再次创建复选框。类似的问题:@Emanuele我确实在回发上创建控件,但是该链接使我意识到,重新创建的控件需要与旧控件具有相同的ID才能映射到重新创建的控件。谢谢。很好。我可以建议使用“更受控制”吗复选框的命名约定?例如chk1,chk2…@Emanuele当然,但这些名称纯粹是为了解决这个堆栈溢出问题,以MCVE“最小完全可验证示例”或任何首字母缩略词为目的。我的实际代码不同。
protected void btnEmail_Click(object sender, EventArgs e)
{
    List<CheckBox> cbList = new List<CheckBox>();
    for (int i = 0; i < 10; i++)
    {
        CheckBox cb = new CheckBox();
        cb.Text = "text" + i;

        //cb.ID = Guid.newGuid().ToString(); //don't do this.
        cb.ID = "checkbox" + i; // <------ do this, have a consistent ID

        cb.ClientIDMode = ClientIDMode.Static;
        pnlEmailCheckboxes.Controls.AddAt(0, cb);
        pnlEmailCheckboxes.Controls.AddAt(0, new LiteralControl("<br/>"));
        cbList.Add(cb);
    }

    Session["checkboxes"] = cbList;
    mpeEmail.Show();
}