不使用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的早期生命周期阶段重建它,步骤如下:
- 先重建父Checkbox(checkbox1):确保在
Page_Init事件里完成这一步,这样ASP.NET能正确加载它的视图状态,你就能拿到它的Checked状态。 - 根据父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
相关产品推荐
相关产品推荐

