我打算当鼠标悬停在另一个控件上时在我的窗体中显示一个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()需要参数,程序无法编译
我预期要创建的控制,并且当鼠标输入的瓷砖,并且不再存在当鼠标左区块显示。
答案 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。然后,我遍历了控件中的每个“特写”(只有一个,但是此代码可用于多个控件),然后将其删除。