You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中如何在创建控件的Sub之外移除该控件

解决在创建PictureBox的Sub外部删除控件的问题

我编写了一段代码,每次运行时都会创建一个PictureBox,该代码运行正常:

Public Sub BtnHit_Click(sender As Object, e As EventArgs) Handles BtnHit.Click
        
        Dim PicBoxNewCard As New PictureBox
        PicBoxNewCard.Width = 114
        PicBoxNewCard.Height = 166
        PicBoxNewCard.SizeMode = PictureBoxSizeMode.Zoom
        DrawCard(PicBoxNewCard)
        Me.Controls.Add(PicBoxNewCard)
        PicBoxNewCard.Location = New Point((257 + (57 * DrawnCardCounter)), 349)

但我希望通过点击按钮在创建这些PictureBox的Sub之外删除它们。我搜索过相关内容,尝试过创建类、面板等方法但都未成功,我知道Me.Controls.Remove(PicBoxNewCard)可以实现,但该代码仅在同一Sub中有效。


方法1:用Panel统一管理卡片控件

这是最省心的方案,先在窗体上拖入一个Panel控件(命名为pnlCards),调整到合适的位置和尺寸,然后修改创建控件的代码,把卡片添加到Panel而非直接添加到窗体:

Public Sub BtnHit_Click(sender As Object, e As EventArgs) Handles BtnHit.Click
        
        Dim PicBoxNewCard As New PictureBox
        PicBoxNewCard.Width = 114
        PicBoxNewCard.Height = 166
        PicBoxNewCard.SizeMode = PictureBoxSizeMode.Zoom
        DrawCard(PicBoxNewCard)
        ' 将控件添加到Panel容器
        pnlCards.Controls.Add(PicBoxNewCard)
        PicBoxNewCard.Location = New Point((257 + (57 * DrawnCardCounter)), 349)
End Sub

删除时直接清空Panel的控件集合即可,同时记得释放资源避免内存泄漏:

Public Sub BtnRemoveCards_Click(sender As Object, e As EventArgs) Handles BtnRemoveCards.Click
        ' 先遍历释放所有PictureBox资源
        For Each ctrl As Control In pnlCards.Controls.OfType(Of PictureBox)().ToList()
            ctrl.Dispose()
        Next
        pnlCards.Controls.Clear()
End Sub

方法2:给PictureBox打标记后筛选删除

如果不想用Panel,可以在创建控件时给它设置独特的Tag属性,后续通过标记筛选目标控件:

Public Sub BtnHit_Click(sender As Object, e As EventArgs) Handles BtnHit.Click
        
        Dim PicBoxNewCard As New PictureBox
        PicBoxNewCard.Width = 114
        PicBoxNewCard.Height = 166
        PicBoxNewCard.SizeMode = PictureBoxSizeMode.Zoom
        ' 设置标记,标识这是卡片控件
        PicBoxNewCard.Tag = "CardPictureBox"
        DrawCard(PicBoxNewCard)
        Me.Controls.Add(PicBoxNewCard)
        PicBoxNewCard.Location = New Point((257 + (57 * DrawnCardCounter)), 349)
End Sub

删除时遍历窗体控件,筛选出带标记的PictureBox并移除:

Public Sub BtnRemoveCards_Click(sender As Object, e As EventArgs) Handles BtnRemoveCards.Click
        ' 转成ToList避免遍历过程中集合变化报错
        For Each picBox As PictureBox In Me.Controls.OfType(Of PictureBox)().ToList()
            If picBox.Tag IsNot Nothing AndAlso picBox.Tag.ToString() = "CardPictureBox" Then
                Me.Controls.Remove(picBox)
                picBox.Dispose() ' 必须释放资源
            End If
        Next
End Sub

方法3:用全局集合存储创建的PictureBox

在窗体类的顶部声明一个全局List,专门保存所有创建的卡片控件:

' 窗体类的全局变量
Private cardPictureBoxes As New List(Of PictureBox)()

修改创建代码,把新生成的PictureBox加入集合:

Public Sub BtnHit_Click(sender As Object, e As EventArgs) Handles BtnHit.Click
        
        Dim PicBoxNewCard As New PictureBox
        PicBoxNewCard.Width = 114
        PicBoxNewCard.Height = 166
        PicBoxNewCard.SizeMode = PictureBoxSizeMode.Zoom
        DrawCard(PicBoxNewCard)
        Me.Controls.Add(PicBoxNewCard)
        PicBoxNewCard.Location = New Point((257 + (57 * DrawnCardCounter)), 349)
        ' 添加到全局集合
        cardPictureBoxes.Add(PicBoxNewCard)
End Sub

删除时直接遍历集合,逐个移除并释放资源:

Public Sub BtnRemoveCards_Click(sender As Object, e As EventArgs) Handles BtnRemoveCards.Click
        For Each picBox As PictureBox In cardPictureBoxes
            Me.Controls.Remove(picBox)
            picBox.Dispose()
        Next
        ' 清空集合
        cardPictureBoxes.Clear()
End Sub

内容的提问来源于stack exchange,提问作者goodscore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:35:51