You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用JavaScript,如何获取动态生成的checkbox1.1的选中状态?

解决ASP.NET动态生成子Checkbox回发后无法获取选中状态的问题

针对你遇到的问题——动态生成的子Checkbox(如checkbox1.1)在回发后因未重建而无法获取状态,这里有两种实用方案,其中第一种完全不需要重建子控件,符合你的需求:

方案1:直接从Request.Form读取子Checkbox状态(无需重建控件)

ASP.NET回发时,所有表单控件的提交数据都会存在Request.Form集合里。如果某个Checkbox被选中,它的ID会作为键出现在这个集合中,对应的值为"on"。所以你不需要重建子Checkbox,直接通过ID去Request.Form里查询即可:

举个例子,假设子Checkbox的ID是"checkbox1.1",判断它是否被选中的代码如下:

bool isCheckbox1_1Checked = Request.Form["checkbox1.1"] != null;

结合你的代码,子Checkbox的ID是checkbox + item[descricao].ToString() + i,你只需要按照这个规则构造出对应的ID字符串,再去Request.Form里判断是否存在该键,就能知道它的选中状态了。这个方法完全绕开了ASP.NET控件状态的限制,简单直接。

方案2:在Page生命周期早期重建子控件(如需保留完整控件状态)

如果你需要操作子Checkbox的其他属性(比如Text、样式),或者后续还要用这个控件,那必须在Page的早期生命周期阶段重建它,步骤如下:

  1. 先重建父Checkbox(checkbox1):确保在Page_Init事件里完成这一步,这样ASP.NET能正确加载它的视图状态,你就能拿到它的Checked状态。
  2. 根据父Checkbox状态重建子Checkbox:在Page_Load事件中,判断父Checkbox是否被选中,如果是,就按照之前的逻辑生成子Checkbox,必须保证ID和第一次生成时完全一致(这是ASP.NET绑定视图状态的关键)。

修改后的代码示例:

protected void Page_Init(object sender, EventArgs e)
{
    // 先重建父Checkbox,确保视图状态能加载
    ReconstructParentCheckboxes();
}

protected void Page_Load(object sender, EventArgs e)
{
    // 获取父Checkbox的选中状态
    CheckBox parentChk = divsname.FindControl("checkbox1") as CheckBox;
    if (parentChk != null && parentChk.Checked)
    {
        // 重建子Checkbox,ID必须和之前生成的完全相同
        ReconstructChildCheckboxes();
    }
}

private void ReconstructParentCheckboxes()
{
    int i = 0;
    foreach (DataRow item in dt.Rows)
    {
        i++;
        if (divsname.ID == "DadosIdentificacao")
        {
            CheckBox chk = new CheckBox();
            chk.Attributes["class"] = "mycheckbox";
            chk.Font.Name = "Tahoma";
            chk.Attributes.Add("runat", "server");
            chk.Text = item[descricao].ToString();
            chk.ID = checkbox + i;
            chk.AutoPostBack = true;
            chk.CheckedChanged += chkEventos;
            divsname.Controls.Add(chk);
        }
    }
}

private void ReconstructChildCheckboxes()
{
    int i = 0;
    foreach (DataRow item in dt.Rows)
    {
        i++;
        if (divsname.ID != "DadosIdentificacao")
        {
            CheckBox chk = new CheckBox();
            chk.Attributes["class"] = "mycheckbox";
            chk.Font.Name = "Tahoma";
            chk.Attributes.Add("runat", "server");
            chk.Text = item[descricao].ToString();
            chk.ID = checkbox + item[descricao].ToString() + i;
            divsname.Controls.Add(chk);
        }
    }
}

为什么之前的Session/ViewState方案没生效?

因为ASP.NET只会为已经存在于控件树上的控件保存状态,如果你没有重建子Checkbox,它不会自动把状态存入ViewState;而Session虽然能存,但需要你手动记录每个子Checkbox的状态,相比之下直接读取Request.Form要高效得多。


内容的提问来源于stack exchange,提问作者Pedro Cardoso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:11:27