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
相关产品推荐
相关产品推荐

