グループボックス内のコントロールを削除します
質問
グループボックスを作成し、ランタイム中にボタンを入力します。また、グループボックスをループしてそれらのボタンを削除するボタン、たとえば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内のコントロールの一部のみが削除されます。私のコードに不足しているものが機能していることを説明できますか?ありがとう。
解決
aでコントロールを削除するとき For Each
ループ、あなたは実際にあなたがループしようとしているコレクションを変更しています。 コレクションの最初のアイテムを削除すると、2番目のアイテムが最初のアイテムになります。しかし今、あなたがあなたのループの2番目のインデックスに到達するとき、 第3 アイテムはその場所にあります。 2番目のアイテムを削除するために効果的にスキップし、最初と3番目のアイテムを削除しました。ループ全体を通して。
代わりに、コントロールをループする必要があります 逆行 各インデックスでアイテムを注文して削除します。 最後からアイテムを削除し始めることで、アイテムの順序や位置に影響しません。
したがって、メソッドを次のように変更するだけです。
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
他のヒント
あなたはそれを通してあなたが反論しているので、あなたはコレクションを変えています、そしてそれはすべきではありません。
むしろのようなものを使用します
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
所属していません StackOverflow