2013-12-22 50 views
-2

我有這一塊的FOREACH代碼,這使得音樂的部分指出的foreach控制在C#中按降序排列

foreach (MusicNote mn in pictureBox1.Controls) 
{ 
    sp.SoundLocation = @"..\\..\\bin\\Debug\\sound\\mapped\\" + mn.pitch+ ".wav"; //find that pressed note 
    Thread.Sleep(mn.duration * 100); //The Ticks * 100 to convert them into milliseconds 
    sp.Play(); //play it 
} 

這應該遍歷所有控件和發揮他們一個接一個,但問題是,它從開始最後一個加入的,而不是第一個像我希望它可以意味着它的演奏中降序爲了不上升像我想的那樣。任何想法如何解決這個問題?

+1

爲什麼不使用經典的'for'循環? –

+0

因爲那時我需要更多的控制,比如顯示音樂筆記等。 – DodoSerebro

回答

0
pictureBox1.Controls.Cast<Control>().Reverse() 
+0

工作就像一個魅力。非常感謝你:) CAST做什麼請取而代之似乎是一種列表 – DodoSerebro

+0

也有一種方法如何清除所有的控制後,我做控制遍歷請? – DodoSerebro

+0

@DodoSerebro有沒有辦法在每次執行控制遍歷之後清除所有控件? –

2

Controls屬性控件的順序是根據每個控制的z索引(作爲Controls屬性返回ControlCollection,不只是一個正常的列表)。

可以通過使用SetChildIndex方法控制每個控制的z索引。如果你在添加控件時使用這種方法明確控制z-index(你不會說控件是如何添加的,所以我假設你在代碼中手動執行),它們應該按照你想要的順序出現你遍歷Controls屬性。

+0

小心解釋一下SetChildIndex更多?它究竟做了什麼?我有一個鍵盤,當我按下按鍵確實音高,音長和形狀.. – DodoSerebro

+0

@DodoSerebro的音符consiting:每個控件的位置可以明確地設定。這使您可以將它們放置在實際有序列表的特定位置。 'SetChildIndex'允許你將控件放在特定的位置(例如,如果你有八個控件,你可以把你想要的控件放在第一個位置)。 – adrianbanks

+0

這是有道理的,所以如果我將第一個元素設置爲位置0,那麼該元素後面的所有其他元素自動排列爲1,2,3,4? – DodoSerebro