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

问题描述 投票:0回答:2

当鼠标悬停在另一个控件上时,我打算在我的表单中显示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()需要参数,程序将无法编译

我希望在鼠标进入磁贴时创建和显示Control,并在鼠标离开磁贴时停止存在。

vb.net winforms
2个回答
1
投票

为了将来参考,控件具有Tag属性,允许您存储任何您喜欢的内容。在这种情况下,您可以存储对新创建的PictureBox的引用。此外,“Sender”参数告诉您哪个控件是事件的来源。您可以将发件人强制转换为控件,然后存储引用。然后,在leave事件中,您可以将发送者强制转换为控件,将.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

0
投票

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

            For Each Closeup In Controls.OfType(Of CloseUp)

                Controls.Remove(Closeup)

            Next

我创建了一个名为Closeup的新类,它继承了PictureBox。然后我在控件中循环每个特写(只有一个,但这个代码适用于多个控件),并删除它们。

© www.soinside.com 2019 - 2024. All rights reserved.