如何在表单中获取许多comboBox的selectedIndex?

时间:2016-06-04 23:23:26

标签: c# combobox

我需要获取表单的许多SelectedIndex个实例的ComboBox。我试过了:

internal static void getComboSelectedIndex(Control control)
{
    foreach (Control c in control.Controls)
    {
        getComboSelectedIndex(c);
        if (c is ComboBox)
        {
            int i = ((ComboBox)c).SelectedIndex;
        }
    }
}

并使用以下代码调用此方法:getComboSelectedIndex(this); 但它不起作用。对于表单中的每个comboBox,它返回Always -1。

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

在WindowsForm第一次迭代后没有递归,循环退出。使用递归,foreach循环在每个组合框之间迭代,但为每个组合框返回selectedindex = -1。

我从另一个问题复制的方法:

public IEnumerable<Control> GetAll(Control control,Type type)

{     var controls = control.Controls.Cast();

return controls.SelectMany(ctrl => GetAll(ctrl,type))
                          .Concat(controls)
                          .Where(c => c.GetType() == type);

}

效果很好,但它只返回windowsForm组合框的编号,但我无法更改它以返回selectedIndexes,因为我不知道linq控件。

答案 1 :(得分:1)

您可以使用以下代码:

internal static void getComboSelectedIndex(Control control)
    {
        List<ComboBox> comboBoxes = new List<ComboBox>();

        foreach (Control c in control.Controls)
        {
            getComboSelectedIndex(c);

            if (c is ComboBox)
            {
                ComboBox curretComboBox = ((ComboBox)c);

                if (curretComboBox.SelectedIndex > -1) // should be greater than -1 not 0 because first index of comboboxes is 0 not 1
                comboBoxes.Add(curretComboBox);
            }
        }
        var orderedList = comboBoxes.OrderBy(item => item.TabIndex).ToList();

        for (int i = 0; i < orderedList.Count; i++)
        {
            ComboBox _current = orderedList[i];

            MessageBox.Show("selected index of " + _current.Name + " is " + _current.SelectedIndex.ToString() + " / TabIndex: " + _current.TabIndex);
        }
    }

答案 2 :(得分:0)

为什么在foreach循环中使用递归函数?

以下代码应返回当前形式的所有组合框的选定索引:

internal static void getComboSelectedIndex(Control control)
{
foreach (Control c in control.Controls)
{
    if (c is ComboBox)
    {
        int i = ((ComboBox)c).SelectedIndex;
MessageBox.Show("selected index of "+ c.name + " is "+ i.ToString());
    }
}
}

答案 3 :(得分:0)

好的,谢谢AGB,你是对的,我修改了我的方法:

    internal static void getComboSelectedIndex(Control control)
    {
        foreach (Control c in control.Controls)
        {
            getComboSelectedIndex(c);
            if (c is ComboBox)
            {
                int i = ((ComboBox)c).SelectedIndex;
                if (i > 0) MessageBox.Show("selected index of " + c.Name + " is " + i.ToString());
            }
        }
    }

现在它有效。我不知道-1表示组合框与&#34;未选择项目&#34;。现在我还有一个小问题:是否有可能在其TabIndex之后顺序获得组合框的selectedIndex?