VB.net使用invoke委托param数组

时间:2013-09-11 14:01:55

标签: vb.net

我在我的Parser中有这个代码,我想将文本传递给Form1,所以我可以更新一些标签或其他什么。 (我的结构如下:Form1 - > Engine - > Parser) 有时我需要传递2个字符串,有时候更多。

Public Class Parser
Public Event NewInfo(<[ParamArray]()> Byval strArray() as String)

Public Sub SomeParser(ByVal m As Match)
Dim strArray() As String = {"Word1", "Word2"}
RaiseEvent NewInfo(strArray)
End Sub

End Class

然后我有另一个班。我将Array传递给Engine,然后传递给Form1,最后:

Public Class Engine
Private parent as Form1
Private WithEvents Parser As New Parser

Private Sub New(ByRef parent as Form1)
Me.parent = parent
EndSub

Private Sub ChangeLabel(ByVal str() As String) Handles Parser.NewInfo
parent.UpdateTextLabel(str)
End Sub

然后我在Form1中有这个:

Public Class Form1
Private WithEvents Engine as New Engine(Me)
Public Delegate Sub UpdateTextLabelDelegate(<[ParamArray]()> ByVal text() As String)
Public Sub UpdateTextLabel(ByVal ParamArray str() As String)
    If Me.InvokeRequired Then
      Me.Invoke(New UpdateTextLabelDelegate(AddressOf UpdateTextLabel), str())
    Else
(Do stuff here)
End Sub
End Class

代码停在Me.invoke(New UpdateTextLabelDelegate).... - line。 异常类似于:System.Reflection.TargetParameterCountException 所以它意味着错误的参数数量。如何正确地做到这一点?

如果有人能够解释并且我能理解如何做到这一点,我会很高兴。

2 个答案:

答案 0 :(得分:2)

我认为您的代码中不需要<[ParamArray]()>,因为它已经是您传递的数组:

Public Delegate Sub UpdateTextLabelDelegate(ByVal text() As String)

至于通过调用传递数据,请不要使用str(),只需使用str

Public Sub UpdateTextLabel(ByVal str() As String)
  If Me.InvokeRequired Then
    Me.Invoke(New UpdateTextLabelDelegate(AddressOf UpdateTextLabel), str)
  Else
    '(Do stuff here)
  End If
End Sub

答案 1 :(得分:1)

终于设法解决了这个问题。这并不困难,但我的错误在我自己的脑海里。

我没有对Parser.vb做任何更改,所以上面的代码是OK。 此外,没有对Engine.vb的更改。 对Form1.vb的更改如下:

Public Class Form1
Private WithEvents Engine as New Engine(Me)
Public Delegate Sub UpdateTextLabelDelegate(<[ParamArray]()> ByVal text() As String)
Public Sub UpdateTextLabel(ByVal str() As String)
    If Me.InvokeRequired Then
      Me.Invoke(New UpdateTextLabelDelegate(AddressOf UpdateTextLabel), New Object() {str})
    Else
'(Do stuff here)
End Sub
End Class

所以,我所做的就是将New Object() {args}插入到调用行,并从ParamArray行中删除Public Sub UpdateTextLabel。 但感谢踢我的头,所以我有理由继续前进! :)