c#是如何在Foreach循环中遍历表单控件的?

本文关键字:表单 遍历 控件 循环 Foreach | 更新日期: 2023-09-27 18:18:00

如标题所示,我的问题是c#如何在foreach循环中迭代表单控件?如果这有点太模糊,我将添加更多的细节:

当我做foreach(Control c in MyForm)时,它如何通过控件索引(?)?它是基于制表顺序还是其他什么?任何帮助将不胜感激,因为我试图找出如果我可以将值放入一个数组在一个整洁和更有组织的方式。

c#是如何在Foreach循环中遍历表单控件的?

foreach总是工作相同,所以在窗体的控件上做它不会改变任何东西。

也没有使用索引;foreach只适用于实现IEnumerable的类的实例,这意味着它们有GetEnumerator方法。foreach使用返回的IEnumerator逐个遍历集合;顺序取决于实际实现。

对于List(或任何数组),这是有序的(即索引0是第一个,1秒,等等);对于IEnumerable的随机实现,您必须查看源代码。在您的特定示例中,查看FormControls集合的类型。这是一个ControlCollection,所以你会想看看参考来源,以了解它是如何枚举的。

从实现来看,它似乎是有序的,有一些防止枚举期间删除控件的保护措施。

它不会根据制表符索引返回控件,它会按照您在Controls集合中添加控件的顺序返回控件。

您可以在文档大纲窗口的设计器中看到此顺序。(Ctrl + Alt + T),并通过在文档大纲窗口中移动控件来改变顺序。此外,如果您使用Bring To frontSend To back工具栏按钮,您可以在设计时更改此顺序。

在运行时,您可以通过调用控件的SendToBackBringToFront方法或Controls集合的SetChildIndex方法来更改此顺序。

要获取控件的索引,可以使用Controls collection的GetChildIndex方法。

还要记住foreach(Control c in this.Controls)只会扫描你直接放在表单上的控件。例如,如果窗体上有一个面板,面板中包含一些控件,则面板的子面板在panel.Controls集合中,而不在窗体的控件集合中。

您指的是控件迭代的顺序吗?我想说的是,这些控件是按照添加到表单控件集合的顺序进行迭代的。您可以在InitializeComponents设计器方法中检查这一点,以查看控件在该方法中列出的顺序。