C# 无法强制转换类型为';ASP.site_master';输入';System.Web.UI.WebControls.Button';。在asp.net中

C# 无法强制转换类型为';ASP.site_master';输入';System.Web.UI.WebControls.Button';。在asp.net中,c#,C#,我刚刚创建了十个按钮和最后两个名为btn_green和btn_red的按钮 我想改变所有按钮的颜色为绿色和红色时,点击这些按钮绿色和红色 我的C#代码是 但我的床运气我只得到了一个错误 描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源 异常详细信息:System.InvalidCastException:无法强制转换对象 将“ASP.site\u master”类型更改为“System.Web.UI.WebControls.Bu

我刚刚创建了十个按钮和最后两个名为btn_green和btn_red的按钮

我想改变所有按钮的颜色为绿色和红色时,点击这些按钮绿色和红色

我的C#代码是

但我的床运气我只得到了一个错误

描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源

异常详细信息:System.InvalidCastException:无法强制转换对象 将“ASP.site\u master”类型更改为“System.Web.UI.WebControls.Button”

我如何逃避这个问题

foreach (Button btn in this.Controls)
返回页面中的所有控件,而不仅仅是按钮。在访问它之前,您需要将其强制转换为按钮或尝试其类型

foreach (Control control in Controls)
{
    var btn = control as Button;
    if (btn != null)
    {
        ...
    }
}

“foreach”不会过滤控件以返回所有按钮。相反,它在所有控件中循环并尝试将它们转换为按钮。如果不是一个按钮,它就失败了

另外(在您的情况下这可能不是问题)
this.Controls
将仅返回直接位于“this”下的控件,而不会嵌套在某些容器中。如果您还需要更深层的控件,则需要一个递归函数

如果不需要递归,可以使用Linq:

foreach(Button btn in Controls.OfType<Button>())
{
   btn.BackColor = Color.Red;
}
foreach(Controls.OfType()中的按钮btn)
{
btn.BackColor=Color.Red;
}

在将控件用作表单中的按钮之前,需要检查控件的类型。控件返回表单中的所有控件

尝试下面的代码块

    foreach (Control objControl in this.Controls)
    {
        if (objControl is Button)
        {
            (objControl as Button).BackColor = Color.DarkGreen;

        }
    }
您也可以使用
if(控件为按钮)
foreach(Button btn in Controls.OfType<Button>())
{
   btn.BackColor = Color.Red;
}
    foreach (Control objControl in this.Controls)
    {
        if (objControl is Button)
        {
            (objControl as Button).BackColor = Color.DarkGreen;

        }
    }