2016-11-15 46 views
1

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

当我做foreach(Control c in MyForm)它如何通过控件索引(?)?它是基于Tab键顺序还是别的吗?任何帮助将不胜感激,因为我试图找出我是否可以以整洁和更有组织的方式将值放入数组中。

+0

这不是一个C#问题,它是一个.NET Windows窗体实现问题。这取决于实施。尝试查找Form.cs的源代码并查看它是如何实现的。 https://开头referencesource。microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ – Mangist

+0

我相信实际上有'GetChildIndex(control)'和'SetChildIndex(control)'方法可以使用。 – Hank

+0

我想你是在问'TabIndex',可能......如果我在按键之间读取数据,并且你明确提到了“tab order”。那是对的吗? – gravity

回答

2

它不会基于选项卡索引返回控件,它会按照您添加它们的顺序返回控件集合Controls

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

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

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

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

+0

不知道改变z顺序实际上修改了底层集合。还有一个理由避免迭代该集合,并取决于顺序! – BradleyDotNET

+0

谢谢你的回应。我将尝试文档大纲方法,看看是否解决了我的难题。另外感谢面板上的附加位等。循环的部分在面板内部,所以在我通过该面板的整个方法中,但是当我去验证完整的表单时,知道必须通过该方法放置每个面板会很好。感谢您的帮助=) –

+0

此解决方案完美运作。非常感谢您的帮助:) –

4

foreach总是工作相同,因此通过窗体的控件做它不会改变任何东西。

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

对于List(或任何数组),这是有序的(即索引0是第一个,1秒等等)。对于IEnumerable的随机实现,您将不得不查看源代码。在您的具体示例中,查看FormControls集合的类型。它是一个ControlCollection所以你想看看Reference Source找到它如何枚举。

根据implementation,它看起来是有序的,在枚举过程中有一些防止控件被移除的保护措施。

+0

感谢您提供非常详细和快速的回​​复。我一定会试着看看参考资料来源。再次感谢kind先生。=) –

0

您是否指控制迭代的顺序?我想说的是,控件是按照它们被添加到窗体控件集合的顺序迭代的。您可以在InitializeComponents设计器方法中查看该方法,以查看控件在该方法中列出的顺序。

+0

或者*在*文档大纲*窗口中查看订单。 –