2010-11-24 87 views
4

我創建了一個groupbox,然後在運行時用按鈕填充它。我還創建了一個按鈕,比如Button1循環訪問groupbox並刪除這些按鈕。這裏是我的代碼 爲Button1:刪除GroupBox內的控件

Public Sub removeControls() 
    For Each ctrl As Control In GroupBox1.Controls 
     GroupBox1.Controls.Remove(ctrl) 
     ctrl.Dispose() 
    Next 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    removeControls() 
End Sub 

執行時,它只是刪除了一些GroupBox1內部控制的,不是全部。你能解釋一下我的代碼中缺少的東西嗎?謝謝。

回答

5

當您在For Each循環刪除控件,你實際上修改,你通過努力環集合。當您刪除集合中的第一個項目時,第二個項目向上移動以成爲第一個項目。但是現在,當你到達循環的第二個索引時,第三個項目就位。您已經有效地跳過了刪除第二項,並且只刪除了第一項和第三項。等整個循環。

相反,您需要遍歷反向控件中的控件並刪除每個索引處的項目。通過開始從最後刪除項目,您不會影響項目的順序或位置。

所以,只要改變你的方法如下:

Public Sub RemoveControls() 
    For i As Integer = (GroupBox1.Controls.Count - 1) To 0 Step -1 
     Dim ctrl As Control = GroupBox1.Controls(i) 
     GroupBox1.Controls.Remove(ctrl) 
     ctrl.Dispose() 
    Next i 
End Sub 
+0

謝謝。有用。 – ghostdog74 2010-11-24 08:42:40

2

您正在更改集合,因爲您正在通過它進行循環,而這不應該完成。

而是使用類似

For i As Integer = GroupBox1.Controls.Count - 1 To 0 Step -1 
    Dim ctrl As Control = GroupBox1.Controls(i) 
    GroupBox1.Controls.Remove(ctrl) 
    ctrl.Dispose() 
Next 
+0

感謝。如果只有我可以選擇2個答案:) – ghostdog74 2010-11-24 08:44:31