【问题标题】:How to remove dynamically created controls?如何删除动态创建的控件?
【发布时间】:2015-04-24 17:24:17
【问题描述】:

我在表单中添加了一些图片框:

代码顶部:

Private Flag As PictureBox

在form1_Load事件下:

Flag.Location = New Point(buttonX, buttonY)
                        Flag.BackColor = Color.Red
                        Flag.BorderStyle = BorderStyle.FixedSingle
                        Flag.Name = "Flag" & Pos
                        Me.TabPage1.Controls.Add(Flag)
                        Flag.BringToFront()

例如,我最终得到了 4 个名为“Flag2”“Flag5”“Flag6”“Flag8”的图片框。然后我尝试使用以下方法将它们全部删除:

Dim con As Control
        For Each con In Me.TabPage1.Controls
            If con.Name.Contains("Flag") Then
                Me.TabPage1.Controls.Remove(con)
            End If
        Next

最终发生的事情并不是所有的图片框都被删除了。如果我多次运行删除代码,它将全部删除,但我试图一次将它们全部删除。我也试过了:

Dim con As Control
        Dim i As Integer = 0
        While i < Me.TabPage1.Controls.Count
            con = Me.TabPage1.Controls(i)
            If con.Name.Contains("Flag") Then
                Me.TabPage1.Controls.Remove(con)
            End If
            i += 1
        End While

两个“删除代码”都按照彼此相同的顺序删除图片框(不是按照顺便创建的顺序),而不是删除所有的图片框。

【问题讨论】:

    标签: vb.net loops dynamic controls


    【解决方案1】:

    试试这样:

    'create the pbs to delete
    Dim pbs = Me.TabPage1.Controls.OfType(Of PictureBox)().
                 Where(Function(pb) pb.Name.Contains("Flag"))
    'loop thru them
    For Each pb In pbs
      Me.TabPage1.Controls.Remove(pb)
    Next 
    

    子:

    Public Sub RemovePictureBoxes(tp As TabPage)
      'create the pbs to delete
      Dim pbs = tp.Controls.OfType(Of PictureBox)().
                 Where(Function(pb) pb.Name.Contains("Flag"))
      'loop thru them
      For Each pb In pbs
        tp.Controls.Remove(pb)
      Next  
    End Sub
    

    用法:

    RemovePictureBoxes(TabPage1)
    

    【讨论】:

    • 我假设“创建要删除的 pbs”代码将在全局范围内声明,因为我在单独的函数中创建/删除。我收到以下错误“对象引用未设置为对象的实例。”
    • 我错误地使用了你给我的代码。我尝试了您建议的功能,结果与我尝试的两个相同。但是我注意到(我的代码也发生了这种情况,我只是没有注意到)是被删除的所有其他框。每次我运行代码时,它都会删除最后一个创建的代码以及从那里创建的所有其他代码。因此,如果我有 10 个盒子,我必须运行代码 4 次才能将它们全部删除。我确信这不是解决问题的最佳方法。有什么想法吗?
    • 这没有意义。它应该将它们全部删除。您是否调试并检查了变量并单步执行代码以查看它在做什么?
    • 我认为删除Private Flag As PictureBox 声明会更好,当你这样做时只需声明一个新的PictureBox
    • 我在“tp.Controls.Remove(pb)”上设置了断点单步执行了您的代码。它永远不会越过那些应该删除但不应该删除的内容。我在另一个类似问题的论坛上读到这个:““每隔一个”效果是因为到达下一个时没有当前btn,所以下一个btn成为当前btn,之后的一个成为下一个btn。收藏品通常是这样。”我不完全理解它,但它会有帮助吗?来源:bytes.com/topic/visual-basic-net/answers/…
    【解决方案2】:

    这对我有用,它在挂起时使用循环返回开始重新启动。它包括删除可能不需要的文件的附加代码。 这是使用 Flowlayout 面板,但代码给了你这个想法。

    start:
    For Each Control In Me.FlowLayoutPanel1.Controls
      If TypeOf Control Is PictureBox Then Me.FlowLayoutPanel1.Controls.Remove(Control)
      If IO.File.Exists(Control.tag.ToString) then                  
        IO.File.Delete(Control.Tag.ToString)
        Me.FlowLayoutPanel1.Controls.Remove(Control)
        System.Threading.Thread.Sleep(100)
        Control.image = Nothing
        Control.Dispose()
        FlowLayoutPanel1.Refresh()
      End If
    Next Control
    If FlowLayoutPanel1.Controls.Count > 0 Then GoTo start
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2013-01-16
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多