如何基于两表关联关系为CheckBox列表的对应匹配项设置选中状态
代码调整方案
原代码核心问题
- 遍历逻辑颠倒:优先遍历了表B的选中项而非表A的全量50项,无法生成完整的50个复选框
- 存在冗余对象和无效操作:未使用声明的
CheckBoxList对象,多余的check2对象无实际作用 - 控件重复添加:内层循环中多次将同一个复选框添加到容器,会导致页面渲染重复控件
- 末尾多余的控件添加操作可能引发空引用或重复渲染问题
修正后代码
int envid = int.Parse(txtenvid.Text); // 表A:全量50项数据源 DataView oDvPop = PopulationBL.BigList(); // 表B:需要默认选中的项数据源 DataView listPop = PopulationBL.SmallListCheckeditems(envid, 1); // 提前将选中项存入HashSet,提升匹配效率,避免嵌套循环 HashSet<string> checkedItems = new HashSet<string>(); foreach (DataRowView row in listPop) { checkedItems.Add(row["POP"].ToString().Trim()); } // 清空容器避免多次执行时重复追加控件 chkListPop.Controls.Clear(); // 遍历表A全量数据生成所有复选框 foreach (DataRowView fullRow in oDvPop) { CheckBox check = new CheckBox(); string popLabel = fullRow["POP_LABEL"].ToString().Trim(); check.Text = popLabel; // 匹配到选中项则设置勾选状态 if (checkedItems.Contains(popLabel)) { check.Checked = true; } chkListPop.Controls.Add(check); }
调整说明
- 修正遍历逻辑:优先遍历表A的全量50项数据,确保所有复选框都能正常生成
- 优化匹配逻辑:用HashSet存储选中项值,无需嵌套循环,匹配效率更高,也避免了重复添加控件的问题
- 增加首尾空格trim操作:避免两端空格导致的匹配失效问题
- 移除所有冗余代码,保留必要逻辑,避免无效操作引发的异常
内容的提问来源于stack exchange,提问作者kOe
相关产品推荐
相关产品推荐

