0

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

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

...但是当我调用它时,应用程序挂起,并且日志文件显示该方法的“无效转换”。怎么可能?它应该处理 TextBoxes 和 ComboBoxes,而忽略其余部分 - 无效演员表可能在哪里?

4

3 回答 3

6

不是foreach这样。

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

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

于 2014-12-29T23:37:49.837 回答
5

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

foreach(Control ctrl in this.Controls)
{
    if(ctrl as TextBox != null)
    {
         //Textbox logic
    }
    if(ctrl as ComboBox!= null)
    {
         //ComboBox logic
    }
}
于 2014-12-29T23:44:34.367 回答
-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;
    }
}
于 2014-12-29T23:57:03.647 回答