4

グループボックスを作成し、実行時にボタンを入力しました。また、グループボックスをループしてそれらのボタンを削除するためのボタン、たとえば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内の一部のコントロールのみが削除され、すべては削除されません。それを機能させるために私のコードに欠けているものを説明できますか?ありがとう。

4

2 に答える 2

5

ループ内のコントロールを削除すると、For Eachループしようとしているコレクションが実際に変更されます。コレクションの最初のアイテムを削除すると、2番目のアイテムが上に移動して最初のアイテムになります。しかし、ループの2番目のインデックスに到達すると、3番目のアイテムがその場所に配置されます。2番目のアイテムの削除を事実上スキップし、1番目と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
于 2010-11-24T06:24:27.163 に答える
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
于 2010-11-24T06:14:47.587 に答える