我需要在一个表单上获得x类型的所有控件.我很确定我以前见过这样的代码:

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

我知道我可以使用递归函数迭代所有控件来生成子控件,但是

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

推荐答案

这是你的另一个 Select .我通过创建示例应用程序对其进行了测试,然后将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());
}

每次它都会返回正确的计数,所以我认为这将非常适合您所寻找的:)

.net相关问答推荐

无法在Designer、VS2022、. NET 8中打开WinForms表单'

为什么Regex.Escape支持数字符号和空格?

DotNet COM初始化问题

Azure管道-使用.NET 8 RC2 SDK生成C#项目失败

问:在 Blazor WASM 应用程序中存储 api 密钥的最佳方式是什么?

使属性只能通过绑定的 Editor(component) 编辑

"投掷;" 是什么意思?靠自己做什么?

如何将 Javascript 日期时间转换为 C# 日期时间?

.NET - WindowStyle = hidden 与 CreateNoWindow = true?

如何判断 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

无法加载文件或程序集WebGrease,版本=1.5.1.25624,Culture=neutral,PublicKeyToken=31bf3856ad364e35或其依赖项之一

将双精度转换为带有 N 个小数的字符串,点作为小数分隔符,并且没有千位分隔符

数据库架构更改后更新 LINQ to SQL 类的最佳方法

无法将文件 *.mdf 作为数据库附加

参数命名:文件名还是文件名?

从 Windows 窗体打开 URL

为什么 System.Timers.Timer 能在 GC 中存活,而 System.Threading.Timer 不能?

风格上的差异:IDictionary vs Dictionary

.NET 中的对象引用有多大?

更改 SqlConnection 超时