3

既然我不能输入参数,我怎么能尊重下面的签名?

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 表达式。

4

2 回答 2

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)
于 2013-04-12T17:51:31.183 回答
2

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

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 在底层实现的方式,所以这应该可以工作。您可以概括对象以获取委托并在更多地方使用它。

于 2013-04-12T18:01:55.090 回答