C# WinForm遍历TableLayoutPanel时出现无法转Button的类型错误
问题原因
TableLayoutPanel.Controls和窗体的Controls集合都属于ControlCollection类型,存储的元素都是Control基类对象,直接在foreach循环中声明变量类型为Button时,运行时会尝试将集合内所有元素强制转换为Button,只要存在任意非Button类型的控件(哪怕是隐藏的控件、嵌套的容器控件),就会抛出类型转换异常。- 遍历
this.Controls报错是必然的,因为该集合中包含tlpColorSettings本身(TableLayoutPanel类型),无法转换为Button。即使你确认tlpColorSettings内只放了2个Button,也可以检查是否存在设计器自动生成的空白占位控件、或者嵌套了其他层级的容器。
修复方案
方案1:使用Linq过滤(推荐)
先引入Linq命名空间:
using System.Linq;
修改循环代码,先过滤出集合中所有Button类型的元素再遍历:
foreach (Button btn in this.tlpColorSettings.Controls.OfType<Button>()) { btn.ForeColor = Properties.Settings.Default.ButtonColor; btn.BackColor = Properties.Settings.Default.TextColor; }
方案2:循环内做类型判断
如果不想引入Linq,也可以在循环内手动做类型校验:
foreach (Control ctl in this.tlpColorSettings.Controls) { if (ctl is Button btn) { btn.ForeColor = Properties.Settings.Default.ButtonColor; btn.BackColor = Properties.Settings.Default.TextColor; } }
内容的提问来源于stack exchange,提问作者Joo
相关产品推荐
相关产品推荐

