C#如何在Foreach循环中迭代表单控件

时间:2016-11-15 21:37:00

标签: c# winforms foreach

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

当我foreach(Control c in MyForm)时,如何通过控件索引(?)?它是基于Tab键顺序还是其他东西?任何帮助都会受到赞赏,因为我试图找出是否可以以更整洁,更有条理的方式将值放入数组中。

3 个答案:

答案 0 :(得分:4)

foreach总是一样,所以在表单的控件上进行操作并不会改变任何内容。

它也没有真正使用索引; foreach仅适用于实现IEnumerable的类的实例,这意味着它们具有GetEnumerator方法。 foreach使用返回的IEnumerator一次查看一个集合;顺序取决于实际的实施。

对于List(或任何数组),这是有序的(即索引0是第一个,1秒,依此类推);对于IEnumerable的随机实现,您必须查看源代码。在您的具体示例中,查看ControlsForm集合的类型。它是ControlCollection,因此您希望查看Reference Source以查找其枚举方式。

基于implementation,它似乎是有序的,并且在枚举期间会删除控件的一些保护措施。

答案 1 :(得分:2)

它不会根据标签索引返回控件,而是按照您添加Controls集合的顺序返回控件。

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

在运行时,您可以通过调用SendToBackBringToFront控件方法或SetChildIndex收集Controls方法来更改此订单。

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

另请注意foreach(Control c in this.Controls)只扫描您直接放在表单上的控件。例如,如果表单上有一个面板,并且面板包含一些控件,则面板的子项位于panel.Controls集合中,而不是表单的控件集合中。

答案 2 :(得分:0)

您指的是控件迭代的顺序吗?我想说控件按照它们被添加到Form的控件集合的顺序进行迭代。您可以在InitializeComponents设计器方法中查看此内容,以查看该方法中列出控件的顺序。