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
上创建XPictureBox
(其中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