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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:39:00