所有ComboBox元素的SelectedIndex

时间:2016-12-12 11:39:23

标签: c# winforms

有没有办法在C#Windows窗体中为所有ComboBox设置SelectedIndex?

我试过这个:

DataType

但似乎没有用。

4 个答案:

答案 0 :(得分:3)

简短回答:如果不是所有控件都是ComboBox,那么它将失败并显示InvalidCastException。第一个也是最简单的技巧只考虑ComboBox

foreach (var cb in Controls.OfType<ComboBox>())
    cb.SelectedIndex = -1;

更长的回答:请注意,如果您有一个控件树,这将失败。你可能想要编写一个扩展方法Descendants()来像这样使用:

foreach (var cb in Descendants().OfType<ComboBox>())
    cb.SelectedIndex = -1;

如果可能的实现类似于未经测试的实现:

public static IEnumerable<Control> Descendants(this Control control)
{
    yield return control;

    var descendants = control.Controls.Cast<Control>().SelectMany(x => Descendants(x));
    foreach (var descendant in descendants)
        yield return descendant;
}

注意:但请注意,它可能不是长期的最佳解决方案,您应该以某种方式标记这些组合框或对其进行数据绑定并处理(View)模型而不是直接操作UI控件。

答案 1 :(得分:2)

foreach (Control cnl in Controls)
{
    if(cnl is ComboBox)
    {
       ComboBox cb = (ComboBox)cnl;
       cb.SelectedIndex = -1;
    }
}

这应该有用。

答案 2 :(得分:1)

添加如下函数:

private void SetComboIndex(Control parent)
{
    foreach (Control c in parent.Controls)
    {
        if(c is ComboBox)
        {
            ComboBox cb = (ComboBox)c;
            cb.SelectedIndex = -1;
        }
        SetComboIndex(c);
    }
}

并从表单中调用它:

SetComboIndex(this)

答案 3 :(得分:0)

并非控件中的所有项目都是组合框。 用这个:

foreach (var control in Controls)
{
    if (control is ComboBox)
        ((ComboBox)control).SelectedIndex = -1;
}