0

我有两个对象,A 和 B,两个对象都有相同的方法,称为 Hi。所以 A.hi 会显示一个消息框说“hi I'm A”,B.hi 会显示一个消息说“hi I'm B”。他们也都有一个按钮来激活这个方法。

如何在同一个处理程序中处理这两个事件?

例如,如果我分开做,我会为 A 做这个。

Private Sub btnHi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHiClassA.Click
   A.hi
End Sub

我想在同一个处理程序中处理这两个事件,我可以用这个逻辑做一个乏味的版本;

Private Sub btnHi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHiClassA.Click, btnHiClassB.Click 
   if sender is btnHiClassA then
      A.hi
   elseif sender is btnHiClassB then
      B.hi
   end if
End Sub

理想情况下,它会是这样的:

Private Sub btnHi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHiClassA.Click, btnHiClassB.Click
   'theObject = sender
   'theObject.hi
End Sub

我该怎么做?

4

2 回答 2

1

使用方法 Hi 定义一个接口 IHiSender。

在您的所有课程中实施 IHiSender。

将 EventArgs 的子类定义为 HiSenderEventArgs,并将附加属性 WhoAmI 定义为类型 IHiSender。

于 2013-04-07T05:45:49.030 回答
0

我并没有完全了解你想要达到的目标以及你想要如何做到这一点,而是根据我得到它的方式来判断,

我会使用Ctype。Ctype 获取对象引用(如发送者)并将其转换为对象,如按钮。通过这种方式,您可以动态获取发件人的属性。因此,如果您有一个事件处理程序,您可以使用任意数量的对象来处理。

有很多方法可以做到这一点,但我会创建一个 Private Sub。

Private Sub ButtonHi(sender As System.Object, e As System.EventArgs)
    Dim ButtonName As String = CType(sender, Button).Name

    If ButtonName = "ButtonHiA" Then
    Msgbox("Hello World, I'm button A!")
    ElseIf ButtonName = "ButtonHiB" Then
    Msgbox("Hello World, I'm button B!")
    End If
End Sub

如您所见,该 sub 不是真正的处理程序,因此我们必须将一个对象指向它:您可以通过不同的方式实现这一点,以下是两种。

在 Form_Load 中添加处理程序:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    AddHandler ButtonHiA.Click, AddressOf ButtonHi
    AddHandler ButtonHiB.Click, AddressOf ButtonHi
End Sub

button_click 上的重定向处理程序:

Private Sub ButtonHiA_Click(sender As System.Object, e As System.EventArgs) Handles ButtonHiA.Click
    ButtonHi(sender, e)
End Sub

Private Sub ButtonHiB_Click(sender As System.Object, e As System.EventArgs) Handles ButtonHiB.Click
    ButtonHi(sender, e)
End Sub

如果这不是您所追求的,请在下面的评论中澄清。

于 2013-04-07T14:01:27.853 回答