我有一个MouseEnter事件,它当前处理我的表单上的一些自定义控件。该计划是纸牌游戏。我有一个集合(handCards),当用户绘制卡片时,它会被填充,然后它会将最新的卡片添加到表单中。此系列包含各种自定义类型的卡片,所有这些卡片都继承自picturebox。从卡座中绘制卡片并将其添加到表单中可以正常工作。我遇到的麻烦是,在运行时,在绘制卡并将其添加到表单后,我创建了一个addhandler代码行,让这些卡响应我的MouseEnter事件,但我的addhandler代码行告诉我MouseEnter不是对象的事件。如何解决这个问题,以便在绘制卡片并将其添加到表单后,当鼠标进入新的自定义控件时,我的MouseEnter事件会触发?这是我尝试过的众多事情之一,我认为应该是最简单,最简单的事情。
deck.DrawCard()
AddHandler handCards(handCards.Count).MouseEnter, AddressOf Cards_MouseEnter
P.S。 MouseEnter事件适用于运行时之前在窗体上的自定义控件,它所做的只是获取控件的图像,并通过将图像放在窗体上的更大的卡上来放大它。
答案 0 :(得分:1)
我假设你的handCards Collection是一个Object Collection。尝试使用CType将其转换为正确的类型,如下所示:
AddHandler CType(handCards(handCards.Count), PictureBox).MouseEnter, AddressOf Cards_MouseEnter
正如@Jason提到的那样使用handCards.Count
作为索引将不起作用,因为它是您的索引为零的项目总数,并且将比Count少一个。
因此handCards(handCard.Count)
应为handCards(handCards.Count -1)
答案 1 :(得分:1)
您可以使用通用集合来避免类型转换。
Private handCards As System.Collections.Generic.List(Of PictureBox) _
= New System.Collections.Generic.List(Of PictureBox)(52)
或您可以使用PictureBox
个对象
Private handCards(5) As PictureBox
请记住,您必须通过为数组的每个元素分配PictureBox
对象来初始化集合或数组。
现在,您可以将处理程序添加到数组的PictureBox
元素,因为PictureBox
派生自实现Control
事件的MouseEnter
。
deck.DrawCard()
If handCards.Count > 0 andAlso handCards.Last() IsNot Nothing then
AddHandler handCards.Last().MouseEnter, AddressOf Cards_MouseEnter
End If
你的处理程序看起来像这样
Private Function Cards_MouseEnter(sender As Object, e As System.EventArgs) As Object
' Handle mouse events here
End Function
答案 2 :(得分:1)
所以这就是我修复它的方式,以防有人遇到这篇文章。做了一个单独的Sub来做AddHandler。程序绘制卡后,它会调用此方法,然后添加我需要的MouseEnter处理程序。 ByVal是关键。我原本以为我应该使用ByRef,但没有。 MouseEnter是一个控件事件,但显然不是Object,所以现在它可以工作。
Public Sub addHandlers(ByVal inputObject As Control)
AddHandler inputObject.MouseEnter, AddressOf Cards_MouseEnter
End Sub
答案 3 :(得分:1)
幸运的是我正在努力,我成功地成功解决了这个问题。
首先添加事件处理程序方法您希望在哪里测试我在Button_Click中添加了此函数
addHandlers(Label1) 'Label one is the control on which I have to attach Mouse Events (Enter,LEave)
现在“addHandlers”功能实现
Public Sub addHandlers(ByVal obj1 As Control)
AddHandler obj1.MouseEnter, AddressOf MouseEventArgs
AddHandler obj1.MouseLeave, AddressOf _MouseLeave
End Sub
现在鼠标事件:
Private Function _MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) As Object
Try
Me.Cursor = Cursors.Default
Catch ex As Exception
End Try
End Function
Private Function MouseEventArgs(ByVal sender As Object, ByVal e As System.EventArgs) As Object
Try
Me.Cursor = Cursors.Hand
Catch ex As Exception
End Try
End Function