2012-12-13 109 views
2

我創建了四個TextBox es(按此順序:textBox1,textBox2,...),並將它們放在GroupBox的下方。然後我說的Click事件:GroupBox中TextBoxes的foreach循環按相反順序迭代?

private void button1_Click(object sender, EventArgs e) 
{ 
    foreach (TextBox tb in groupBox1.Controls.OfType<TextBox>()) 
    { 
     if (string.IsNullOrWhiteSpace(tb.Text)) 
     { 
      Console.WriteLine(tb.Name); 
     } 
    } 
} 

當我運行該程序,然後單擊Button(當所有TextBox ES是空的),這是輸出我得到:

textBox4

textBox3

TextBox2中

textBox1的

顯然foreach循環以相反的順序遍歷GroupBox控件。我預計它將從textBox1textBox4,因爲這是他們創建並放入組框的順序。

爲什麼foreach反向循環?只是好奇...

+1

您正在假設。當您觀察Visual Studio中的數據結構(並展開集合)時,您看到它們的順序是什麼?大多數收藏品不保證訂單,如果您需要的話,可以使用已排序的收藏或在使用之前進行排序。 –

+1

TimSchmelter已經證實了這個實現,這個集合會按照添加項目的順序來列舉的假設顯然是問題的關鍵所在。 'foreach'只是'GetEnumerator'返回的狀態機周圍的編譯器糖,它可以有一個完全自定義的實現。 –

+0

訂單在哪種情況下很重要? – Jodrell

回答

5

控件按照控件的Z順序放置在同一個父容器(從最上到最下)中。你想如何訂購?

0

試試這個

對基本收集和`GetEnumerator`方法的實現
foreach (TextBox txt in Controls.OfType<GroupBox>().SelectMany(g=>g.Controls.OfType<TextBox>()).ToList().Reverse<TextBox>()) 
     { 
      //Write your logic here 
     }