首页 > 解决方案 > 运行时移除图片,只移除一张图片上的两张

问题描述

我有 a form1、 atextbox1和 2 按钮,Bt_Draw还有Bt_Clear.

用户输入一个数字textbox1并单击Bt_Draw,这将创建 X PictureBoxForm1其中 X 是输入数字,图像来自资源文件)。

如果用户点击Bt_Clear这个应该清除所有PictureBox最终存在的。

我遇到的问题是,当我单击Bt_Clear它时,只能清除一PictureBox对二,如下所示:

在此处输入图像描述

这是我的代码:

Bt_Draw事件:(这个工作正常)

Private Sub Bt_Draw_Click(sender As Object, e As EventArgs) Handles Bt_Draw.Click

    Dim insertX As Long = 150 'image coordinate
    Dim insertY As Long = 250

    For i = 1 To Integer.Parse(Me.TextBox1.Text)

        Dim Img As New PictureBox

        With Img
            .Size = New Size(20, 20)
            .Location = New Point(insertX, insertY)
            .Image = My.Resources.Resource1.Image1 'image1 in recource1.resx
            .Name = "Roll" & i
        End With

        Me.Controls.Add(Img)
        insertX = insertX + 20

    Next
End Sub

事件Bt_Clear

Private Sub Bt_Del_Click(sender As Object, e As EventArgs) Handles Bt_Del.Click

    For Each ctrl In Me.Controls
        Dim pb = TryCast(ctrl, PictureBox)

        If pb IsNot Nothing Then
            If pb.Name.Contains("Roll") Then
                Me.Controls.Remove(pb)
            End If
        End If

    Next

End Sub

我也尝试了更多的技术来压制所有PictureBox相同的结果。

在调试时,似乎For Each ctrl In Me.Controls循环不会返回所有控件。我该如何解决这个问题,为什么这段代码会这样?

标签: vb.net

解决方案


发生这种情况是因为您在迭代控件时删除了它们。您可以使用如下解决方案来收集控件并在单独的步骤中删除收集的控件。

'A list to collect all controls you want to remove.
Dim listRemoveControls As New List(Of PictureBox)

'get all controls you want to remove and collect them on the list.
For Each ctrl In Me.Controls
    Dim pb = TryCast(ctrl, PictureBox)

    If pb IsNot Nothing Then
        If pb.Name.Contains("Roll") Then
            listRemoveControls.Add(pb)
        End If
    End If
Next

'now you can remove the controls collected in the list.
For Each pbItem As PictureBox In listRemoveControls
    If Me.Controls.Contains(pbItem) Then
        Me.Controls.Remove(pbItem)
        pbItem.Dispose()
    End If
Next

如果您可以使用 Linq (.NET >= 3.5),则使用以下解决方案OfType要短得多:

For Each pbItem As PictureBox In Me.Controls.OfType(Of PictureBox).ToList()
    If Me.Controls.Contains(pbItem) Then
        Me.Controls.Remove(pbItem)
        pbItem.Dispose()
    End If
Next

推荐阅读