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

时间:2014-12-29 23:35:11

标签: c# combobox casting textbox runtime-type

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

Button
ComboBox
Label
TextBox

我有一个" Clear"调用此方法的按钮:

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;
        }
    }
}

...当我打电话给它时,应用程序挂起,日志文件显示"无效的演员"对于那种方法。怎么会这样?它应该处理TextBoxes和ComboBoxes,并忽略其余部分 - 无效的演员阵容在哪里?

3 个答案:

答案 0 :(得分:6)

那不是foreach所做的。

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

您可以致电.OfType<T>()以获取您正在寻找的已过滤列表。

答案 1 :(得分:5)

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

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

答案 2 :(得分:-2)

根据Gunther的出发点,这有效:

foreach (Control ctrl in this.Controls)
{
    if (ctrl as TextBox != null)
    {
        ctrl.Text = string.Empty;
    }
    if (ctrl as ComboBox != null)
    {
        ((ComboBox)ctrl).SelectedIndex = -1;
    }
}