为什么我会得到带有此代码的“无效转换”

本文关键字:无效 转换 无效转换 代码 为什么 | 更新日期: 2023-09-27 18:35:34

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

Button
ComboBox
Label
TextBox

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

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

。然而,当我调用它时,应用程序挂起,并且日志文件显示该方法的"无效转换"。怎么会这样?它应该处理文本框和组合框,而忽略其余的 - 无效的强制转换可能在哪里?

为什么我会得到带有此代码的“无效转换”

这不是

foreach所做的。

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

可以调用.OfType<T>()以获取要查找的筛选列表。

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

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

基于冈瑟的起点,这是可行的:

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