c#循环窗口表单元素

本文关键字:元素 表单 窗口 循环 | 更新日期: 2023-09-27 18:17:44

我有一个窗口窗体,有一对组合框。我需要完成的是让每个有项目的组合框将其选定的索引设置为0。不是按名称手动执行每个组合框,而是有一个按类型返回所有子框的函数。或者获取所有子元素并将它们的类型与combobox元素的类型进行比较?

@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);

c#循环窗口表单元素

我是这样做的:

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

如果组合框不是直接在表单上,而是在一个容器(组框,面板等)中,那么使用它来代替myForm。

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

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

您可以枚举控件并使用Linq:

对它们进行筛选。
foreach (var comboBox in yourForm.Controls.OfType<ComboBox>())
{
}

但是如果你在另一个控件中有控件(比如面板中的组合框),那么你就必须创建一个递归版本

当控件包含在组框中时,您可以这样做

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

您可以通过以下方式遍历表单中的控件:

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

但是请记住,其中一个控件可能是一个群痘或一个内部有控件的面板,因此您将需要某种递归函数来返回表单中的所有控件,无论一个控件是否在另一个控件中,然后按类型筛选集合。

但是我们运气不错,Stackoverflow的其他帖子解决了这个问题:使用c#

从表单中获得可用的控件

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

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

注意,如果你嵌入一个控件(例如,把它放在一个表格布局面板),那么这个将不会找到你的控件。

相反,您需要递归地调用该方法来查找控件,并每次检查您正在查看的控件是否有子控件