C# 尝试循环窗体上的按钮控件时出现“无法强制转换类型的对象”错误

C# 尝试循环窗体上的按钮控件时出现“无法强制转换类型的对象”错误,c#,winforms,button,casting,tablelayoutpanel,C#,Winforms,Button,Casting,Tablelayoutpanel,在表单中,我添加了一个TableLayoutPanel,并在其中添加了5个按钮 在运行时,我在循环中向Form1添加10个按钮。然后我使用foreach来处理这10个按钮 foreach (Button C in this.Controls) // do something 运行程序时,出现一个错误: 无法将“System.Windows.Forms.TableLayoutPanel”类型的对象强制转换为“System.Windows.Forms.Button”类型 我认为发生此错误是

在表单中,我添加了一个TableLayoutPanel,并在其中添加了5个按钮

在运行时,我在循环中向Form1添加10个按钮。然后我使用foreach来处理这10个按钮

foreach (Button C in this.Controls)
    // do something
运行程序时,出现一个错误:

无法将“System.Windows.Forms.TableLayoutPanel”类型的对象强制转换为“System.Windows.Forms.Button”类型

我认为发生此错误是因为TableLayoutPanel包含5个按钮

是的,我可以删除这个TableLayoutPanel并直接在表单中添加5个按钮,但是TableLayoutPanel在我的代码中帮助很大

那么,有没有任何解决方案可以遍历这10个按钮,同时仍然保留TableLayoutPanel

此外,我是否可以分别遍历窗体中的按钮和TableLayoutPanel中的按钮?

窗体控件的类型为,因此您的代码可能无法运行! 请使用以下代码:

foreach (Control C in this.Controls)
{
    // do something
}

控件的类型为,因此您的代码可能无法运行! 请使用以下代码:

foreach (Control C in this.Controls)
{
    // do something
}


您当前的代码将尝试迭代表单上的所有控件,不管怎样,所有顶级控件。。您需要使用递归来迭代嵌套在其他控件中的所有控件,然后将每个控件强制转换为按钮,从而得到异常

只需指定要迭代的控件:

foreach (var button in this.Controls.OfType<Button>())
{
    // now you'll iterate over just the Button controls
}

您当前的代码将尝试迭代表单上的所有控件,不管怎样,所有顶级控件。。您需要使用递归来迭代嵌套在其他控件中的所有控件,然后将每个控件强制转换为按钮,从而得到异常

只需指定要迭代的控件:

foreach (var button in this.Controls.OfType<Button>())
{
    // now you'll iterate over just the Button controls
}
System.Windows.Forms.TableLayoutPanel'输入'System.Windows.Forms.Button'

正如错误所解释的那样,您尝试为无法进行类型转换的类型转换元素

原因:foreach循环

foreach (Button C in this.Controls) // Button is the wrong type caste
此.Controls将返回当前表单中的每个控件,这包括无法转换为按钮的其他表单元素,如TableLayoutPanel。因此,请按如下方式过滤它们

答复:

foreach (var C in this.Controls){
     if(c.GetType()== typeof(Button)){
          Button btn = (Button)item; //do work using this
      } 
}
注意:如果按钮位于另一个控制器内,此方法将不提供这些按钮。相反,您需要访问其中的特定控件和循环

System.Windows.Forms.TableLayoutPanel'输入'System.Windows.Forms.Button'

正如错误所解释的那样,您尝试为无法进行类型转换的类型转换元素

原因:foreach循环

foreach (Button C in this.Controls) // Button is the wrong type caste
此.Controls将返回当前表单中的每个控件,这包括无法转换为按钮的其他表单元素,如TableLayoutPanel。因此,请按如下方式过滤它们

答复:

foreach (var C in this.Controls){
     if(c.GetType()== typeof(Button)){
          Button btn = (Button)item; //do work using this
      } 
}
注意:如果按钮位于另一个控制器内,此方法将不提供这些按钮。相反,您需要访问其中的特定控件和循环