由于我无法输入参数,我如何尊重以下签名?
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表达式。
答案 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在幕后实现的方式,所以这应该有效。您可以将对象概括为一个委托并在更多地方使用它。