当前位置: 首页 > 知识库问答 >
问题:

如何获取特定类型(Button/TextBox)的Windows窗体窗体的所有子控件?

郑理
2023-03-14

我需要获取表单上所有类型为X的控件。我很确定我在过去见过一次这样的代码:

dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))

我知道我可以使用递归函数迭代所有控件获得子控件,但是有没有更简单或更直接的方法,可能像下面这样?

Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox

共有3个答案

谭炎彬
2023-03-14

这是递归GetAllControls()的改进版本,它实际上在私有变量上工作:

    private void Test()
    {
         List<Control> allTextboxes = GetAllControls(this);
    }
    private List<Control> GetAllControls(Control container, List<Control> list)
    {
        foreach (Control c in container.Controls)
        {
            if (c is TextBox) list.Add(c);
            if (c.Controls.Count > 0)
                list = GetAllControls(c, list);
        }

        return list;
    }
    private List<Control> GetAllControls(Control container)
    {
        return GetAllControls(container, new List<Control>());
    }
何德寿
2023-03-14

在C#中(因为您将其标记为这样),您可以使用如下的LINQ表达式:

List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();

null

在本例中,您首先创建控件列表,然后调用一个方法来填充它。因为这个方法是递归的,所以它不返回列表,它只是更新列表。

List<Control> ControlList = new List<Control>();
private void GetAllControls(Control container)
{
    foreach (Control c in container.Controls)
    {
        GetAllControls(c);
        if (c is TextBox) ControlList.Add(c);
    }
}

使用 函数在一条LINQ语句中完成这一操作是可能的,尽管我对它并不熟悉。有关这方面的更多信息,请参阅本页。

编辑%2以返回集合:

正如@profk所建议的,简单地返回所需控件的方法可能是更好的实践。为了说明这一点,我对代码进行了如下修改:

private IEnumerable<Control> GetAllTextBoxControls(Control container)
{
    List<Control> controlList = new List<Control>();
    foreach (Control c in container.Controls)
    {
        controlList.AddRange(GetAllTextBoxControls(c));
        if (c is TextBox)
            controlList.Add(c);
    }
    return controlList;
}
谯皓君
2023-03-14

这是你的另一个选择。我通过创建一个示例应用程序来测试它,然后在初始GroupBox中放入一个GroupBox和一个GroupBox。在嵌套的GroupBox中,我放了3个TextBox控件和一个按钮。这是我使用的代码(甚至包括您正在寻找的递归)

public IEnumerable<Control> GetAll(Control control,Type type)
{
    var controls = control.Controls.Cast<Control>();

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

要在form load事件中测试它,我需要初始GroupBox内所有控件的计数

private void Form1_Load(object sender, EventArgs e)
{
    var c = GetAll(this,typeof(TextBox));
    MessageBox.Show("Total Controls: " + c.Count());
}

它每次都返回正确的计数,所以我认为这将完美地满足您的需求:)

 类似资料:
  • 我有一个简单的申请与2个表格。一个表单(form1)允许用户在列表框中选择记录。一旦进行了选择,第二个表单(form2)就应该用第一个表单中的数据更新。 用户应该能够选择一个不同的记录,第二个表单应该用新的数据更新。 我上面展示的只是创建更多的form2版本,它没有更新form2的当前迭代。

  • 本文向大家介绍C#递归遍历窗体所有textbox控件并设置textbox事件的方法,包括了C#递归遍历窗体所有textbox控件并设置textbox事件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#递归遍历窗体所有textbox控件并设置textbox事件的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C# Winform 子窗体访问父级窗体的控件和属性,包括了C# Winform 子窗体访问父级窗体的控件和属性的使用技巧和注意事项,需要的朋友参考一下 今天在做一个联系人管理的C#设计时,遇到了这个问题,我需要将父窗体中的textBox中的值传到子窗体并进行数据库查询操作,我用了new 父窗体().textBox.text;来进行值传递,然而并无卵用,经过多次试验,找到了一个比较简

  • 它需要两种形式才能输入特定事务的所有信息。我希望能够在这两个表单之间来回翻转,保留在每个表单上输入的内容,直到‘保存’按钮被单击。 我想我应该可以使用Form2.Show,Me.Hide,然后使用Form1.Show,Me.Hide。我第一次转到Form2时,它经过了Form2 load事件(这是合理的),但对Form1上控件内容的任何知识都丢失了。即使Form1是隐藏的(而不是关闭的),其控件的

  • 我的EmployeeDB类 使用系统;使用System.Collections.Generic;使用System.LINQ;使用System.Text;使用System.Data.SQLClient;使用System.Data; 命名空间测试{公共类employeeedb{私有字符串连接字符串; 然后构建类库,并将引用添加到windows窗体项目中。

  • 问题内容: 我在AWT中看到了一种方法:。在JavaFx中,是否有任何方法可以获取所有窗口的JavaFx应用程序? 谢谢, 问题答案: AFAIK,仍然没有适当的方法来执行此操作。 尽管有一种 肮脏的短期 方法: 浏览的源代码,有一个静态方法似乎可以满足您的期望:。 但是有很多免责声明: