在标题中,我的问题是C#如何在foreach
循环中迭代表单控件?如果有点太模糊,我会添加更多细节:
当我foreach(Control c in MyForm)
时,如何通过控件索引(?)?它是基于Tab键顺序还是其他东西?任何帮助都会受到赞赏,因为我试图找出是否可以以更整洁,更有条理的方式将值放入数组中。
答案 0 :(得分:4)
foreach
总是一样,所以在表单的控件上进行操作并不会改变任何内容。
它也没有真正使用索引; foreach
仅适用于实现IEnumerable
的类的实例,这意味着它们具有GetEnumerator
方法。 foreach
使用返回的IEnumerator
一次查看一个集合;顺序取决于实际的实施。
对于List
(或任何数组),这是有序的(即索引0是第一个,1秒,依此类推);对于IEnumerable
的随机实现,您必须查看源代码。在您的具体示例中,查看Controls
上Form
集合的类型。它是ControlCollection
,因此您希望查看Reference Source以查找其枚举方式。
基于implementation,它似乎是有序的,并且在枚举期间会删除控件的一些保护措施。
答案 1 :(得分:2)
它不会根据标签索引返回控件,而是按照您添加Controls
集合的顺序返回控件。
您可以在文档大纲窗口中的设计器中查看此顺序。 ( Ctrl + Alt + T )并通过在文档大纲窗口中移动树中的控件来更改顺序。此外,如果您使用Bring To front
和Send To back
工具栏按钮,则可以在设计时更改此顺序。
在运行时,您可以通过调用SendToBack
和BringToFront
控件方法或SetChildIndex
收集Controls
方法来更改此订单。
要获取控件的索引,可以使用GetChildIndex
集合的Controls
方法。
另请注意foreach(Control c in this.Controls)
只扫描您直接放在表单上的控件。例如,如果表单上有一个面板,并且面板包含一些控件,则面板的子项位于panel.Controls
集合中,而不是表单的控件集合中。
答案 2 :(得分:0)
您指的是控件迭代的顺序吗?我想说控件按照它们被添加到Form的控件集合的顺序进行迭代。您可以在InitializeComponents
设计器方法中查看此内容,以查看该方法中列出控件的顺序。