C# WinForm遍历布尔列表/数组时所有值均为false问题求助
问题根本原因
bool属于值类型,你在构造函数中将selected1~selected10添加到selectedBools列表时,做的是值拷贝操作,相当于把这10个变量当时的false值复制了一份存到列表里。后续你修改selected1这类独立变量的值时,完全不会影响列表里已经存储的值,所以遍历列表时永远都是初始的false。
修复方案
方案1(最推荐):废弃独立bool变量,直接用列表管理状态
直接删除selected1~selected10的定义,所有状态读写都直接操作selectedBools的对应索引位,还能顺便删掉10份重复的点击事件代码:
// 构造函数里直接初始化10个false的状态位 selectedBools = new List<bool>(new bool[10]);
给每个PictureBox的Tag属性赋值对应的索引(0~9),所有PictureBox绑定同一个点击事件即可:
private void CommonPictureBox_Click(object sender, EventArgs e) { var pctBox = sender as PictureBox; int index = (int)pctBox.Tag; if (!selectedBools[index]) { pctBox.Image = null; selectedBools[index] = true; pctBox.BackColor = Color.Red; } else { selectedBools[index] = false; pctBox.BackColor = Color.White; try { pctBox.Image = Image.FromFile(filePaths[index + Page * 10]); } catch { } } }
上传按钮的筛选逻辑直接遍历索引即可,不需要复杂的查找:
List<int> selectedIndexes = new List<int>(); for (int i = 0; i < selectedBools.Count; i++) { if (selectedBools[i]) { selectedIndexes.Add(i); } }
方案2(需要保留原有独立变量时可选):用引用类型包装bool
如果不想改现有结构,可以定义简单的包装类把bool包成引用类型,这样变量和列表存的是同一个引用,修改会同步:
public class BoolWrapper { public bool Value { get; set; } } // 原变量定义改为引用类型 public BoolWrapper selected1 = new BoolWrapper { Value = false }; public BoolWrapper selected2 = new BoolWrapper { Value = false }; // ...剩下的变量同理 // 列表定义改为存储包装类 private List<BoolWrapper> selectedBools = new List<BoolWrapper>();
后续修改状态时要改selected1.Value,遍历列表时判断selected.Value即可同步状态。
现有代码其他隐藏问题
你上传逻辑里写的a => a = true是赋值操作,不是相等判断,会强制把列表元素改为true,需要修正为a => a == true,换用上面的方案后这段查找逻辑可以直接删掉。
内容的提问来源于stack exchange,提问作者Rain
相关产品推荐
相关产品推荐

