我有一个包含以下类型控件的表单(仅限):
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,并忽略其余部分 - 无效的演员阵容在哪里?
答案 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;
}
}