【问题标题】:custom event handler visualbasic自定义事件处理程序
【发布时间】:2011-03-30 19:25:41
【问题描述】:

我的工作需要一些可视化基础编程,而我只使用 C# 编程。

所以我有这个代码:

Public Custom Event Command As JQDialogEventHandler
        AddHandler(ByVal value As JQDialogEventHandler)
            commandHandler += value
        End AddHandler
        RemoveHandler(ByVal value As JQDialogEventHandler)
            If commandHandler IsNot Nothing Then
                commandHandler -= value
            End If
        End RemoveHandler
        RaiseEvent()

        End RaiseEvent
    End Event

我收到错误消息:未为类型“ControlesModificados.ControlesModificados.JQDialogEventHandler”和“ControlesModificados.ControlesModificados.JQDialogEventHandler”定义运算符“+”。

如何以其他方式编写此代码“commandHandler -= value”,以便错误消失!或者我如何为事件处理程序定义这些运算符。
谢谢。

已编辑

更多代码:

Namespace ControlesModificados
Public Class JQDialogButton
    Inherits Button
    Private commandHandler As JQDialogEventHandler

    Public Custom Event DialogCommand As JQDialogEventHandler
        AddHandler(ByVal value As JQDialogEventHandler)
            commandHandler += value
        End AddHandler
        RemoveHandler(ByVal value As JQDialogEventHandler)
            If commandHandler IsNot Nothing Then
                commandHandler -= value
            End If
        End RemoveHandler
    End Event
    ...
  Protected Overrides Sub OnClick(ByVal e As EventArgs)
        If commandHandler IsNot Nothing Then
            commandHandler(Me, New JQDialogEventArgs() With { _
              .CommandArgument = Me.CommandArgument, _
              .CommandName = Me.CommandName _
            })
        Else
            MyBase.OnClick(e)
        End If
    End Sub

如您所见,DialogCommand 正在使用另一个 JQDialogHandler,所以我不能只使用

Public Custom Event DialogCommand As JQDialogEventHandler

【问题讨论】:

    标签: .net vb.net event-handling


    【解决方案1】:

    Simplified sample from MSDN

    ' this is the same as obj.Ev_Event += EventHandler
    AddHandler Obj.Ev_Event, AddressOf EventHandler
    
    Obj.CauseSomeEvent()
    
    ' this is the same as obj.Ev_Event -= EventHandler
    RemoveHandler Obj.Ev_Event, AddressOf EventHandler
    

    【讨论】:

      【解决方案2】:

      您需要特定的自定义实现吗? 您可以在 VB.net 中执行此操作:

      Public Event Command(sender as object, e as JQEventDialog)   ''//to define events
      Public Event Command as JQDialogEventHandler   ''//to define events
      
      RaiseEvent Command(me, e)   ''//to raise an event
      
      Addhandler object.Event, addressof method     ''//to add a subscriber
      Removehandler object.Event, addressof method   ''//to remove as subscriber
      

      更新您的代码

      理想情况下,您会这样做: 公共类 JQDialogBu​​tton 继承按钮

          public event DialogCommand as JQDialogEventHandler
      
          Overrides Sub OnClick(ByVal e As EventArgs)
      
              RaiseEvent DialogCommand(Me, _
                                       New JQDialogEventArgs() With { _
                                          .CommandArgument = Me.CommandArgument, _
                                          .CommandName = Me.CommandName _
                                      })
      
          End Sub
      End Class
      

      但是由于您需要检查事件的订阅者,您可以这样做(您需要在 AddHandler 和 RemoveHandler 部分添加一些空检查):

      Public Class JQDialogButton
          Inherits Button
      
          Private commandHandler As Eventhandler
      
          Public Custom Event DialogCommand As Eventhandler
              AddHandler(ByVal value As Eventhandler)
                  commandHandler = [Delegate].Combine(commandHandler, value)
              End AddHandler
              RemoveHandler(ByVal value As Eventhandler)
                  commandHandler = [Delegate].Remove(commandHandler, value)
              End RemoveHandler
              RaiseEvent()
                  commandHandler.Invoke(Me,  New JQDialogEventArgs() With {.CommandArgument = Me.CommandArgument, .CommandName = Me.CommandName})
              End RaiseEvent
          End Event
      
          Protected Overrides Sub OnClick(ByVal e As EventArgs)
              If commandHandler IsNot Nothing Then
                  RaiseEvent DialogCommand()
              Else
                  MyBase.OnClick(e)
              End If
          End Sub
      End Class
      

      【讨论】:

      • 我想我会这样做,这是因为我正在尝试迁移此控件:JQDialog 我从这个问题中得到:SOQ
      • @euther:第二种方法(Public Event Command as JQDialogEventHandler)与您发布的代码 sn-p 相同,所以应该没问题。
      • @Pondidum 谢谢你,我会测试它,我会告诉你它是怎么回事!
      • @euther:实际上我最后打开了 VisualStudio 来修复它:D
      • @Pondidum 我认为你没看错,但我必须检查一下,稍后我会告诉你!
      【解决方案3】:

      像在c#中一样编写它,然后使用这个奇妙的工具将其转换为vb

      http://www.developerfusion.com/tools/convert/csharp-to-vb/

      【讨论】:

      • 这正是我所做的,我最终得到了我在这里发布的代码。
      猜你喜欢
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      相关资源
      最近更新 更多