Удалить элементы управления внутри GroupBox - PullRequest
4 голосов
/ 24 ноября 2010

Я создал групповую коробку, а затем заполнил ее кнопками во время выполнения.Я также создал кнопку, скажем Button1, чтобы пройти через групповое поле и удалить эти кнопки.Вот мой код для Button1:

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, а не все.Можете ли вы объяснить, чего не хватает в моем коде, чтобы заставить его работать?Спасибо.

Ответы [ 2 ]

5 голосов
/ 24 ноября 2010

Когда вы удаляете элементы управления в цикле 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
2 голосов
/ 24 ноября 2010

Вы изменяете коллекцию, когда вы ее просматриваете, и этого делать не следует.

Вместо этого используйте что-то вроде

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
...