2016-11-15 100 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

或者*在*文檔大綱*窗口中查看訂單。 –