在控件中更改特定对象的foreach变量(C#)

时间:2015-04-09 11:03:02

标签: c# winforms

我有一个winform(VisualStudio 2013,C#),有几种类型的对象。我想在一种类型的所有对象中更改属性(可见性)。这是我的表述:

private void offToolStripMenuItem_Click(object sender, EventArgs e)
{
    GroupBox v = (GroupBox)sender;
    foreach (Control g in Controls)
    {
        GroupBox v = (GroupBox)g;
        g.Visible = false;
    }
}

问题是,当我想要启动表单时,Visual Studio会向我发送此消息:

  

错误1:无法在此范围内声明名为“v”的局部变量   因为它会给'v'赋予不同的含义,这已经是   用于“父级或当前”范围以表示其他内容E:\ 3D Tic   Tac Toe - druháverze\ 3D Tic Tac Toe - druháverze\ Form1.cs 2203 26 3D   Tic Tac Toe - druháverze

无论发出什么消息,我都不会在程序中的任何其他位置使用变量v。我可能正在寻找某种异常处理程序。

谢谢! : - )

4 个答案:

答案 0 :(得分:2)

您在当前范围内定义了v两次:

**GroupBox v = (GroupBox)sender;**
foreach (Control g in Controls)
{
    **GroupBox v = (GroupBox)g;**
    g.Visible = false;
}

您好像试图在组合框中隐藏所有控件?如果是这种情况,我会将您的代码修改为:

foreach (Control ctrl in groupBox.Controls)
{
    ctrl.Visible = false;
}

或者,如果您需要隐藏所有GroupBox类型:

foreach (Control ctrl in this.Controls)
{
    if(ctrl.GetType() == typeof(GroupBox))
        ctrl.Visible = false;
}

或者隐藏表单上的所有控件:

foreach (Control ctrl in this.Controls)
{
    ctrl.Visible = false;
}

答案 1 :(得分:1)

您在循环之外使用变量vGroupBox v = (GroupBox)sender;

所以在循环中你不能再使用v变量名,因为它已经存在于当前范围内。

但请注意:实际上你根本不需要循环GroupBox v = (GroupBox)g;,因为你没有在你的循环中使用v变量。

更新。

从你的问题的这一部分:我可能正在寻找某种异常处理程序。 - 你要问的是什么并不是很清楚。您不需要任何异常处理程序来处理此类错误,因为它是编译时错误,而不是运行时错误。

答案 2 :(得分:0)

-> GroupBox v = (GroupBox)sender;
foreach (Control g in Controls)
{
    -> GroupBox v = (GroupBox)g;
    g.Visible = false;
}

您可能还想将循环更改为:

foreach (GroupBox g in Controls)

答案 3 :(得分:0)

我对您的问题有点困惑,因为您的代码很可能会产生其他错误。

我认为您可能正在寻找的解决方案应如下所示:

private void offToolStripMenuItem_Click(object sender, EventArgs e)
{
    GroupBox v = (GroupBox)sender;

    foreach (Control g in Controls)
    {
        if (g is GroupBox) // only if g is a GroupBox set Visible to false
            g.Visible = false;
    }
}