我在C#(Visual Studio Winform)中制作了一个简单的tic tac toe游戏。我添加了一个包含文件菜单的菜单条,其中包含一个" New Game"选项。我试图做的是重置所有按钮'文本和我已禁用它们所以我想再次启用它们。当我只有一个menustrip和我的表单上的按钮时,我使用了以下代码,并且它有效。但是现在我在表单中添加了一个标签,这段代码无效。我知道我可以简单地为每个按钮重置值,但我想知道添加标签时出了什么问题。提前致谢。 :)
try
{
foreach (Control c in Controls)
{
Button b = (Button)c;
b.Text = "";
b.Enabled = true;
}
}
catch { }
答案 0 :(得分:2)
this.Controls.OfType<Button>().ToList().ForEach(b => { b.Text = ""; b.Enabled = true; });
答案 1 :(得分:2)
您的代码不再起作用,因为Controls集合现在也包含Label,因此当您的循环到达Label控件时,它会在此行引发异常
Button b = (Button)c;
你不能将Label强制转换为Button,但是这个异常被空的try catch吞噬,你的循环终止而没有任何警告。具有空的try / catch被认为是一种不好的做法,更好地删除它们并让异常显示。
使用OfType可枚举扩展名可以避免您的问题,只获取Button类型的控件。其余代码现在不需要任何其他更改。
foreach (Button b in Controls.OfType<Button>())
{
b.Text = "";
b.Enabled = true;
}
但请记住,此循环适用于表单控件容器。如果添加其他类型的容器(如GroupBox或Panel)并在该控件内移动按钮,则需要在该容器上循环控制属性。
修改强>
要从循环中排除特定按钮,您可以将IEnumerable<T>.Where
的调用添加到OfType
返回的序列中。例如
foreach (Button b in Controls.OfType<Button>().Where(x => x.Name != "button10")
.....