C#循环窗口表单元素

时间:2011-12-14 12:20:35

标签: c# windows forms combobox

我有一个窗体,有几个组合框。 我需要完成的是让每个具有项目的组合框将其选定的索引设置为0.而不是手动按名称执行每个组合框,是否有一个按类型返回所有​​子项的函数。或者让所有的孩子和他们的类型与组合框元素的类型进行比较?

@noah,你的原始代码最初没有用,但我需要的只是提醒孩子们被称为控件(谢谢)。

由此我创建了一个递归函数,它将所有组合框设置为不仅仅是主窗体的直接后代:

private void recursiveSetComboBox(Control element)
{
    foreach (Control a in element.Controls)
    {
        if (a.Controls.Count != 0)
            recursiveSetComboBox(a);
        else if (a.GetType().Name == "ComboBox")
        {
            ComboBox b = (ComboBox)a;

            b.SelectedIndex = 0;
        }
    }
}

recursiveSetComboBox(this);

6 个答案:

答案 0 :(得分:3)

我就是这样做的:

foreach (var comboBox in myForm.Controls.OfType<ComboBox>())
{
    comboBox.SelectedIndex = 0;
}

如果组合框不是直接在表单上但在容器内(组框,面板等),那么使用它而不是myForm。

答案 1 :(得分:2)

您必须使用递归函数来检查每个控件及其子项..试试这个:

public void CheckForComboBox(Control crl)
{
foreach (Control crl in this) {

    if (crl is ComboBox && ((ComboBox)crl).Items.Count > 0) {
        ((ComboBox)crl).SelectedIndex = 1;
    } else if (crl.Controls != null && crl.Controls.Count > 0) {
        CheckForComboBox(crl);
    }
}
}

答案 2 :(得分:1)

您可以枚举控件并使用Linq过滤它们:

foreach (var comboBox in yourForm.Controls.OfType<ComboBox>())
{
}

但是如果你在另一个控件中有控件(比如面板中的组合框),那么你将不得不制作一个递归版本。

答案 3 :(得分:0)

您可以通过以下方式迭代表单中的控件:

foreach(Control c in MyForm.Controls)
{
//Do something here
}

但请记住,其中一个控件可能是一个groupox或一个内部有控件的面板,所以你需要某种递归函数来返回表单中的所有控件,无论一个控件是否在其他控件内部,然后按类型过滤集合。

但我们祝你好运,Stackoverflow中的其他帖子可以解决这个问题:Get available controls from a form using C#

答案 4 :(得分:0)

您可以像这样遍历表单上的控件:

foreach (Control control in MyForm.Controls) {
     // test control type
}

请注意,如果您嵌入控件(例如将其放在表格布局面板中),则无法找到您的控件。

相反,您需要递归调用方法来查找控件,每次都要检查您正在查看的控件has child controls

答案 5 :(得分:0)

当控件包含在组框中时,您可以执行此操作

 foreach (Control group in this.Controls)             //Control combo in this.Controls)
            {

                if (group.GetType().Name == "GroupBox")  //(con is ComboBox)
                {
                    foreach (Control con in group.Controls)
                    {
                        if (con.GetType().Name == "ComboBox")
                        {

                            ComboBox combo = (ComboBox)con;
                            _dtStaff=new DataTable();
                              _dtStaff = _staff.getStaffList();
                            combo.DataSource = _dtStaff;
                            combo.DisplayMember = _dtStaff.Columns[1].ToString();
                            combo.ValueMember = _dtStaff.Columns[0].ToString();
                        }
                    }
                }
            }