为什么我会使用此代码获得"Invalid Cast"?

B. *_*non 0 c# combobox textbox casting runtime-type

我有一个表单,其中包含以下类型的控件(仅):

Button
ComboBox
Label
TextBox
Run Code Online (Sandbox Code Playgroud)

我有一个"清除"按钮,调用此方法:

private void ClearControls()
{
    foreach (TextBox txtbx in this.Controls)
    {
        if (txtbx != null)
        {
            txtbx.Text = string.Empty;
        }
    }
    foreach (ComboBox cmbx in this.Controls)
    {
        if (cmbx != null)
        {
            cmbx.SelectedIndex = -1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...但是当我调用它时,应用程序挂起,日志文件显示该方法的"无效转换".怎么会这样?它应该处理TextBoxes和ComboBoxes,并忽略其余的 - 无效的演员阵容在哪里?

SLa*_*aks 6

那不是那个foreach.

foreach循环中指定类型不会跳过其他类型的项目; 相反,它会将每个项目转换为该类型.

您可以致电.OfType<T>()获取您要查找的已过滤列表.


gra*_*ish 5

foreach将尝试将控件强制转换为指定的类型,这将给出无效的强制转换异常,您应该做的是:

foreach(Control ctrl in this.Controls)
{
    if(ctrl as TextBox != null)
    {
         //Textbox logic
    }
    if(ctrl as ComboBox!= null)
    {
         //ComboBox logic
    }
}
Run Code Online (Sandbox Code Playgroud)