【问题标题】:.NET How to handle mutliple events in same handler.NET 如何在同一个处理程序中处理多个事件
【发布时间】:2013-04-07 05:30:23
【问题描述】:

我有两个对象,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

我该怎么做?

【问题讨论】:

    标签: .net vb.net visual-studio-2010


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      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
      

      如果这不是您想要的,请在下方的评论中澄清。

      【讨论】:

      • 问题说明两个对象都具有相同的方法,称为 Hi。这个答案完全忽略了这一点。
      • 我完全理解了这些方法的一部分,这个答案表明我并没有真正理解他的意思,但这可以作为替代品。
      • 哦,好吧,如果 Rawr Rang 有任何用处,我会保留我的答案。
      • 谢谢,我认为 Pieter 明白了,但您的回答也让我对其他事情有了了解。谢谢
      • 乐于助人,Rawr Rang!这种类型的代码非常适合处理动态创建的控件的事件!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      相关资源
      最近更新 更多