Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在运行时删除图像,仅在两个屏幕上删除一个图像_Vb.net - Fatal编程技术网

Vb.net 在运行时删除图像,仅在两个屏幕上删除一个图像

Vb.net 在运行时删除图像,仅在两个屏幕上删除一个图像,vb.net,Vb.net,我有一个form1,一个textbox1和两个按钮,Bt\u Draw和Bt\u Clear 用户在textbox1中输入一个数字,然后单击Bt_Draw,这将在Form1上创建XPictureBox(其中X是输入的数字,图像来自资源文件) 如果用户点击Bt_Clear这将清除所有最终出现的图片框 我遇到的问题是,当我点击Bt_Clear时,它只在两个上清除一个PictureBox,如下所示: 这是我的代码: Bt_Drawevent:(这一个很好用) Bt\u清除事件: Private Su

我有一个
form1
,一个
textbox1
和两个按钮,
Bt\u Draw
Bt\u Clear

用户在
textbox1
中输入一个数字,然后单击
Bt_Draw
,这将在
Form1
上创建X
PictureBox
(其中X是输入的数字,图像来自资源文件)

如果用户点击
Bt_Clear
这将清除所有最终出现的
图片框

我遇到的问题是,当我点击
Bt_Clear
时,它只在两个上清除一个
PictureBox
,如下所示:

这是我的代码:

Bt_Draw
event:(这一个很好用)

Bt\u清除事件:

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
我还尝试了一些其他技术来抑制所有
图片盒
,效果相同


调试时,似乎Me.Controls中每个ctrl的
循环都不会返回所有控件。我如何解决这个问题,为什么代码会这样做?

这是因为您在迭代控件时删除了这些控件。您可以使用如下解决方案在单独的步骤中收集控件和

“收集所有要删除的控件的列表。
Dim ListRemoveControl作为新列表(图片盒)
'获取要删除的所有控件并将其收集到列表中。
对于Me.Controls中的每个ctrl键
Dim pb=TryCast(ctrl,PictureBox)
如果pb不是什么,那么
如果pb.Name.包含(“滚动”),则
ListRemoveControl.Add(pb)
如果结束
如果结束
下一个
'现在您可以删除列表中收集的控件。
对于ListRemoveControl中作为PictureBox的每个pbItem
如果Me.Controls.Contains(pbItem)则
Me.Controls.Remove(pbItem)
pbItem.Dispose()
如果结束
下一个
如果您可以使用Linq(.NET>=3.5),则以下使用的解决方案要短得多:

(PictureBox.ToList()类型的Me.Controls.Of中作为PictureBox的每个pbItem的
)
如果Me.Controls.Contains(pbItem)则
Me.Controls.Remove(pbItem)
pbItem.Dispose()
如果结束
下一个

您必须
Dispose()
控件,而不是
Remove()
它。当您处置该控件时,它也将从它所属的集合中移除(
Remove()
不处置该对象)。您还可以通过为每个
循环删除
中的元素来修改正在迭代的集合。例如,您可以在Me.Controls.OfType(PictureBox.ToList()
中为每个pBox迭代
。但是向后的
For
循环可能更简单。您只需为Me.Controls.OfType(PictureBox.ToList()pBox?.Dispose()Next
中的每个pBox使用
。请不要使用
Remove()
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