1

我知道我的问题很简单,但我无法弄清楚我的代码有什么问题。我有这本 Head First C# 书,我在 VB.NET 中转换了代码。我希望在我单击表单中的按钮后调用类的catches子例程。Pitcher但什么也没有发生。

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim myBall As New Ball
        Dim pitcher As New Pitcher
        myBall.OnBallInPlay(New BallEventArgs(10, 20))
    End Sub
End Class

Public Class Ball
    Public Event BallInPlay(ByVal sender As Object, ByVal e As BallEventArgs)
    Public Sub OnBallInPlay(ByVal e As BallEventArgs)
        RaiseEvent BallInPlay(Me, e)
    End Sub
End Class

Public Class BallEventArgs
    Inherits EventArgs
    Dim trajectory As Integer
    Dim distance As Integer
    Public Sub New(ByVal trajectory As Integer, ByVal distance As Integer)
        Me.trajectory = trajectory
        Me.distance = distance
    End Sub
End Class

Public Class Pitcher
    Public WithEvents mySender As Ball

    Public Sub catches(ByVal sender As Object, ByVal e As EventArgs) Handles mySender.BallInPlay
        MessageBox.Show("Pitcher: ""I catched the ball!""")
    End Sub
End Class

调用后Ball.OnBallInPlayPitcher.catches应听。不是吗,还是我遗漏了一些明显而重要的东西?

4

2 回答 2

2

您需要将 MyBall 事件连接到 pitcher.catches 方法。由于 Myball 是在方法中声明的,因此您不能使用 WithEvents 关键字。

要在运行时连接处理程序,请使用AddHandler.

Dim myBall As New Ball
Dim pitcher As New Pitcher
AddHandler myBall.BallInPlay, AddressOf pitcher.catches
myBall.OnBallInPlay(New BallEventArgs(10, 20))

要断开您使用的处理程序RemoveHandler

RemoveHandler myBall.BallInPlay, AddressOf pitcher.catches

编辑

我刚刚理解了问题/缺失的部分。你只需要定义Pitcher.MySender因为:

  • 它是用WithEvents关键字声明的
  • 并且您已经通过调用该catches方法Handles mySender.BallInPlay

    Dim myBall As New Ball
    Dim pitcher As New Pitcher
    pitcher.mySender = myBall
    myBall.OnBallInPlay(New BallEventArgs(10, 20))
    
于 2013-09-05T22:50:25.257 回答
1

你定义pitcher了,但你从不使用它:

Dim pitcher As New Pitcher

不做任何事情,因此,永远不能调用 catches 子例程,因为没有 ball 的实例。

此外,mySender从不实例化,mySender并且myBall引用不同的引用Ball

于 2013-09-05T22:31:25.470 回答