我创建了一个组合框,然后在运行时使用按钮填充它。我还创建了一个按钮,比如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中的一些控件,而不是全部。你能解释我的代码中缺少什么使它工作吗?感谢。
答案 0 :(得分:5)
当您在For Each
循环中删除控件时,实际上是在修改您尝试循环的集合。当您删除集合中的第一个项目时,第二个项目向上移动成为第一个。但是现在,当你到达循环的第二个索引时,第三个项就在它的位置。您已经有效地跳过删除第二项,只删除了第一项和第三项。等等整个循环。
相反,您需要以 reverse 顺序遍历控件并删除每个索引处的项目。通过开始从最后删除项目,您将不会影响物品的顺序或位置。
所以,只需将您的方法更改为以下内容:
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
答案 1 :(得分: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