AdressOf方法签名

时间:2013-04-12 17:49:05

标签: vb.net .net-2.0 begininvoke

由于我无法输入参数,我如何尊重以下签名?

Private Sub SetFocusToRow(ByRef ultraGridRow As Infragistics.Win.UltraWinGrid.UltraGridRow)
    grdSoldeOuverture.ActiveCell = ultraGridRow.Cells(0)
    grdSoldeOuverture.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.EnterEditMode)
End Sub

当我这样称呼它时

Me.BeginInvoke(New MethodInvoker(AddressOf Me.SetFocusToTemplateAddRow))

我在使用Microsoft Visual Basic 2005的Visual Studio 2005中使用.NET 2.0,因此不能选择lambda表达式。

2 个答案:

答案 0 :(得分:3)

您可以使用lambda捕获需求并将其传递到:

Foo arg = GetTheFoo()

BeginInvoke(New MethodInvoker(Sub() SetFoo(arg)))

编辑:

首先,将您的方法更改为不通过ByRef - 这是不必要的:

Private Sub SetFocusToRow(ByVal ultraGridRow As Infragistics.Win.UltraWinGrid.UltraGridRow)
    grdSoldeOuverture.ActiveCell = ultraGridRow.Cells(0)
    grdSoldeOuverture.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.EnterEditMode)
End Sub

接下来,定义一个委托:

' Define your delegate:
Delegate Sub SetFocusToRowDelegate(ByVal ultraGridRow As Infragistics.Win.UltraWinGrid.UltraGridRow)

然后你可以通过以下方式致电:

BeginInvoke(new SetFocusToRowDelegate(AddressOf SetFocusToRow), arg)

答案 1 :(得分:2)

由于lambdas会导致问题,您可以尝试使用对象手动实现它们:

Class FooCurry

    Private bar as Foo

    Private Sub new (foo as Foo)
       bar = foo
    End Sub

    Public sub DoFoo()
       bar.SetFoo()
    EndSub
End Class

dim foocurry as new FooCurry(foo)
BeginInvoke(New MethodInvoker(AdressOf foocurry.DoFoo))

这就是lambdas在幕后实现的方式,所以这应该有效。您可以将对象概括为一个委托并在更多地方使用它。