2013-06-19 107 views
0

我一直陷在我的程序的這一部分。 當我打電話給listbox.selectitemchange事件時,我想要顯示適量的trackbar和標籤。刪除動態創建的控件

現在,它不能正常工作。 其中一些事件被調用時會被刪除,其中一些不會。

foreach (Label label in Controls.OfType<Label>()) 
{ 
    if (label.Tag != null && label.Tag.ToString() == "dispose") 
    { 
     label.Dispose(); 
    } 
} 

foreach (TrackBar trackBar in Controls.OfType<TrackBar>()) 
{ 
    if (trackBar.Tag != null && trackBar.Tag.ToString() == "dispose") 
    { 
     trackBar.Dispose(); 
    } 
} 


    for (int i = 0; i < calc; i++) 
    { 
     //string[] LineWidthSplitted = lines[lineWidth].Split(' '); 
     //Int32.TryParse(LineWidthSplitted[2], out WidthValue); 


     Label Label = new Label(); 
     Label.Name = "TrackbarWidth" + LabelName++; 
     Label.Tag = "dispose"; 
     Label.Text = "Board -" + LabelName + "- Height:"; 
     Label.Location = new Point(10, 450 + (50 * LabelName)); 
     Label.Size = new System.Drawing.Size(100, 25); 
     this.Controls.Add(Label); 



     TrackBar trackBar = new TrackBar(); 
     trackBar.Name = "TrackbarWidth" + trackbarName++; 
     trackBar.Tag = "dispose"; 
     trackBar.Maximum = 85; 
     trackBar.Minimum = 65; 
     trackBar.SmallChange = 5; 
     trackBar.TickFrequency = 5; 
     trackBar.Value = 65; 
     trackBar.Location = new Point(150, 450 + (50 * trackbarName)); 
     trackBar.Size = new System.Drawing.Size(100, 25); 
     this.Controls.Add(trackBar); 


     lineWidth += 4; 

    } 

同時,當我刪除的foreach爲跟蹤條,得到正確顯示的所有標籤。 它們全部被刪除,重新創建需要創建的價格量,沒有例外。

有什麼理由?

謝謝。

+2

好,如果你創建的所有標籤,都作爲標籤「處理」,並且所有帶有「處置」標籤的標籤都應該被丟棄,那麼問題是什麼? – Nolonar

+0

,因爲當我調用foreach來獲取軌跡條被刪除。他們中的一些人仍然留[軌道杆和標籤],我找不到任何理由。 – user1859829

+1

嘗試從父項中移除它們。 –

回答

8

請勿立即在標籤上使用「Dispose」。首先刪除它們。請注意,您不能修改控件集合在foreach裏面,所以你必須做這樣的事情:

List<Label> itemsToRemove = new List<Label>(); 
foreach (Label label in Controls.OfType<Label>()) 
{ 
    if (label.Tag != null && label.Tag.ToString() == "dispose") 
    { 
     itemsToRemove.Add(label); 
    } 
} 

foreach (Label label in itemsToRemove) 
{ 
    Controls.Remove(label); 
    label.Dispose(); 
} 

如果你想刪除所有不同類型的控件一舉:

List<Control> itemsToRemove = new List<Control>(); 
foreach (Control ctrl in Controls) 
{ 
    if (ctrl.Tag != null && ctrl.Tag.ToString() == "dispose") 
    { 
     itemsToRemove.Add(ctrl); 
    } 
} 

foreach (Control ctrl in itemsToRemove) 
{ 
    Controls.Remove(ctrl); 
    ctrl.Dispose(); 
} 
+1

不客氣。順便說一句,你必須對軌跡欄做同樣的事情,所以你可以只在控件中查找「控制」類型,檢查標籤,然後刪除所有標籤,如果你知道表單上的所有控件都是「dispose」在標籤需要同時處理。說得通? – Tombala

+0

我不確定你的意思。但是,我需要刪除3種類型的控件。現在我只有3個這樣的代碼給了我一個解決方案。你是說有更簡單的方法嗎? – user1859829

+0

已編輯,以顯示如何一次刪除所有類型的控件。 – Tombala

2

我現在不能測試這個,但我認爲你也應該從你添加它們的表單控件集合中刪除控件。順便說一句,你的情況,我想你可以避開OfType推廣和使用老式for..loop,將允許執行只有一個循環....

for(int x = this.Controls.Count - 1; x >= 0; x--)) 
{ 
    Control ctr = this.Controls[x]; 
    if (ctr Is Label && ctr.Tag != null && ctr.Tag.ToString() == "dispose") 
    { 
     this.Controls.Remove(ctr); 
     ctr.Dispose(); 
    } 
    if(ctr Is TrackBar && ctr.Tag != null && ctr.Tag.ToString() == "dispose") 
    { 
     this.Controls.Remove(ctr); 
     ctr.Dispose(); 
    } 
} 

注意如何從集合中刪除元素使用for..loop應該以相反順序完成,從集合的結尾到開始

+0

標籤現在正確刪除。但軌道杆沒有。當事件被調用時,一些仍然存在。 – user1859829