質問

グループボックスを作成し、ランタイム中にボタンを入力します。また、グループボックスをループしてそれらのボタンを削除するボタン、たとえば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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top