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

C# WinForm如何更简洁获取所有CheckedListBox控件列表

实现方法

你不需要手动逐个添加控件到列表中,直接遍历窗体控件集合并按类型筛选即可,这种方式不会因为后续增删控件需要修改代码,维护成本更低。

无嵌套控件场景(所有CheckedListBox直接放在窗体上)

如果你的CheckedListBox没有放在Panel、GroupBox、TabPage这类容器控件内,可以直接遍历窗体的Controls集合筛选:

// 项目已启用LINQ的写法(VS2008默认支持,需引用System.Core)
private void button1_Click(object sender, EventArgs e)
{
    List<CheckedListBox> boxes = this.Controls
        .OfType<CheckedListBox>()
        .ToList();
}

如果项目没有启用LINQ,可以用基础循环实现:

public List<CheckedListBox> boxes = new List<CheckedListBox>();
private void button1_Click(object sender, EventArgs e)
{
    boxes.Clear(); // 避免重复点击按钮导致重复添加
    foreach (Control ctrl in this.Controls)
    {
        if (ctrl is CheckedListBox)
        {
            boxes.Add((CheckedListBox)ctrl);
        }
    }
}

存在嵌套控件场景(控件放在容器内)

如果你的CheckedListBox放在分组框、面板、选项卡等容器中,直接遍历窗体Controls集合无法拿到嵌套层级的控件,需要写递归方法遍历所有子控件。
首先在窗体类中添加兼容VS2008 C#版本的通用递归查找方法:

private List<T> FindAllControls<T>(Control container) where T : Control
{
    List<T> result = new List<T>();
    foreach (Control ctrl in container.Controls)
    {
        if (ctrl is T)
        {
            result.Add((T)ctrl);
        }
        if (ctrl.HasChildren)
        {
            result.AddRange(FindAllControls<T>(ctrl));
        }
    }
    return result;
}

调用时只需要一行代码即可拿到所有层级的CheckedListBox:

public List<CheckedListBox> boxes = new List<CheckedListBox>();
private void button1_Click(object sender, EventArgs e)
{
    boxes = FindAllControls<CheckedListBox>(this);
    // 后续直接使用boxes列表即可
}

补充说明

  • 这种自动遍历的方式容错率更高,后续新增、删除窗体上的CheckedListBox时,不需要修改遍历相关的代码,不会出现手动添加时漏加、错加控件的问题。
  • 如果只需要查找某一个特定容器内的CheckedListBox,只需要把调用方法时传入的this替换为对应容器的控件名即可,比如FindAllControls<CheckedListBox>(groupBox1)就只会查找groupBox1内部的所有CheckedListBox。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:09:25