如何删除最近添加的控件?

时间:2019-01-31 20:22:37

标签: vb.net winforms

我打算当鼠标悬停在另一个控件上时在我的窗体中显示一个PictureBox。然后,我想在鼠标离开控件时使用一个单独的事件。此事件将从控件中删除显示的PictureBox。但是,由于我的事件是私有子对象,因此在后一个事件中我无法直接访问控件的名称。解决方案是删除最近添加的控件的方法。如果不存在这样的方法,或者存在解决此问题的替代方法,将不胜感激。

我尝试仅使用Controls.Remove(),但这需要一个参数。控件名称作为字符串也不起作用,因为参数必须是控件本身。

Private Sub Tile_MouseEnter(Sender As Object, e As EventArgs)

    Dim CloseUpPic As New PictureBox With {Properties}
    CloseUpPic.Image = Sender.Image
    Controls.Add(CloseUpPic)

    Refresh()

End Sub

Private Sub Tile_MouseLeave(Sender As Object, e As EventArgs)

    Me.Controls.Remove()

End Sub

由于.Remove()需要参数,程序无法编译

我预期要创建的控制,并且当鼠标输入的瓷砖,并且不再存在当鼠标左区块显示。

2 个答案:

答案 0 :(得分:1)

供以后参考,控件具有Tag属性,该属性使您可以存储所需的任何内容。在这种情况下,您可以存储对新创建的PictureBox的引用。此外,“发送者”参数告诉您哪个控件是事件的来源。您可以将发件人转换为控件,然后存储引用。然后,在请假事件中,您可以将发件人转换为控件,将.Tag转换为控件,最后将其删除:

Private Sub Tile_MouseEnter(Sender As Object, e As EventArgs)
    Dim ctl As Control = DirectCast(Sender, Control)

    Dim CloseUpPic As New PictureBox With {Properties}
    CloseUpPic.Image = Sender.Image
    Controls.Add(CloseUpPic)

    ctl.Tag = CloseUpPic

    Refresh()
End Sub

Private Sub Tile_MouseLeave(Sender As Object, e As EventArgs)
    Dim ctl As Control = DirectCast(Sender, Control)
    Dim ctlToRemove As Control = DirectCast(ctl.Tag, Control)
    Me.Controls.Remove(ctlToRemove)
End Sub

答案 1 :(得分:0)

我最终使用以下代码解决了我的问题:

            For Each Closeup In Controls.OfType(Of CloseUp)

                Controls.Remove(Closeup)

            Next

我创建了一个自己的新类,叫做“特写”,它继承了PictureBox。然后,我遍历了控件中的每个“特写”(只有一个,但是此代码可用于多个控件),然后将其删除。