vb.net - 运行时移除图片,只移除一张图片上的两张
问题描述
我有 a form1
、 atextbox1
和 2 按钮,Bt_Draw
还有Bt_Clear
.
用户输入一个数字textbox1
并单击Bt_Draw
,这将创建 X PictureBox
(Form1
其中 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
循环不会返回所有控件。我该如何解决这个问题,为什么这段代码会这样?
解决方案
发生这种情况是因为您在迭代控件时删除了它们。您可以使用如下解决方案来收集控件并在单独的步骤中删除收集的控件。
'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
推荐阅读
- javascript - 为什么设置 hiddenColumns 和 colWidths 时,我的 Handsontable 自定义单元格渲染器仅适用于第一行?
- gitlab - 尝试使用多/可选手动步骤在 GitLab CI 中选择环境
- node.js - 未处理的拒绝类型错误:当我向护照提供错误的凭证时,多次调用`next()`
- python - 您可以在列表上使用 Filter() 函数从更大的列表中创建新列表吗?
- docker - 每次重新启动容器时,如何使 docker 容器运行脚本?
- javascript - Node.js 中的文件路径
- flutter - Flutter:手机验证firebase_auth在提交错误代码时出错
- python - 无法使用 Selenium 关闭浏览器内的广告弹出窗口并且正在扼杀我的自动化
- python - numpy.fft.fft 中参数 n 的影响是什么
- excel - 通过忽略 MS Excel 中非相邻单元格的 NA 来计算最小值