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

为何指定ID选中CheckBoxList项时,多个项被选中?(附C#代码)

问题原因与解决方案

你遇到的问题核心是引用类型的特性导致的对象复用问题,咱们一步步拆解:

问题根源分析

看你循环里的这段代码:

foreach (DataRow dr in dt.Rows) { 
    ListItem li = new ListItem((string)dr["LD"], dr["ID"]+""); 
    cl1.Items.Add(li); 
    cl2.Items.Add(li); 
    cl2.Items.Add(li); 
}

这里你只创建了一个ListItem实例li,然后把同一个实例的引用分别添加到cl1的Items集合,还两次添加到cl2的Items集合里。

ListItem是引用类型,所有这些添加操作并没有复制对象本身,只是把指向同一个对象的引用放进了不同的集合。当你调用SelectCheckBoxList方法设置listItem.Selected = true时,你修改的是这个共享对象的属性——所有引用这个对象的CheckBox项(包括cl1里的和cl2里重复的项)都会同步变成选中状态,因为它们本质上指向的是同一个对象。

修复方案

解决方法很简单:每次向不同的CheckBoxList(或同一控件的Items集合)添加项时,都创建新的ListItem实例,不要复用同一个对象。修改后的循环代码如下:

foreach (DataRow dr in dt.Rows) { 
    // 为cl1创建独立的ListItem实例
    cl1.Items.Add(new ListItem((string)dr["LD"], dr["ID"].ToString())); 
    // 为cl2创建第一个独立的ListItem实例
    cl2.Items.Add(new ListItem((string)dr["LD"], dr["ID"].ToString())); 
    // 如果确实需要向cl2重复添加同一项,也要创建新实例
    cl2.Items.Add(new ListItem((string)dr["LD"], dr["ID"].ToString())); 
}

这样每个添加到控件中的ListItem都是完全独立的对象,修改其中一个的Selected属性只会影响对应的那个CheckBox项,不会牵连其他控件或同一控件里的其他项。

另外注意:如果原代码里的cl2.Items.Add(li);重复是笔误的话,记得去掉多余的那一行哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:09:31