使用foreach重置每个按钮的文本和启用的值

时间:2014-12-21 16:19:11

标签: c# winforms button foreach

我在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 { }

2 个答案:

答案 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")
.....