我不明白这个数据网格视图新动作调用命令的语法应该是什么



我正在尝试生成一个程序来监视数据库文件的更改,并返回数据网格视图列表中的最后 10 个条目。

我已经搜索了大量与调用和新操作相关的Google参考资料,并尝试了各种代码迭代,但由于即使在阅读Microsoft文档和论坛参考资料后,我也不完全理解Invoke New Action语句,因此我无法使语法正确。

Private Sub UpdateDgvThread()
RemoveHandler watcher.Changed, AddressOf OnChanged
DataGridView1.Invoke(New Action(AddressOf UpdateDgv))
AddHandler watcher.Changed, AddressOf OnChanged
End Sub

运行程序时,我收到"系统操作(T)"类型参数太少的错误,我最接近的是将错误行更改为

DataGridView1.Invoke(New Action(Of ????)(AddressOf UpdateDgv))

这似乎是一个更正的语法(?),但我不知道????应该是什么。

看起来您正在尝试将带有参数的方法的地址传递到Action(没有泛型类型参数的版本)的构造函数中。

相反,您应该使用正确的构造函数声明要UpdateDgv的参数的类型

New Action(Of T, ...)()

以下是UpdateDgv的三种可能版本,以及它们相应的Invoke调用。

Private Sub UpdateDgv0()
End Sub
Private Sub UpdateDgv1(arg1 As Object)
End Sub
Private Sub UpdateDgv2(arg1 As Object, arg2 As EventArgs)
End Sub
Private Sub UpdateDgvThread()
DataGridView1.Invoke(New Action(AddressOf UpdateDgv0))
DataGridView1.Invoke(New Action(Of Object)(AddressOf UpdateDgv1), New Object())
DataGridView1.Invoke(New Action(Of Object, EventArgs)(AddressOf UpdateDgv2), New Object(), New EventArgs())
End Sub

另一种选择是只使用匿名方法来包装对UpdateDgv的调用,你根本不会看到Action构造函数。这是有效的,因为Sub()满足Delegate,就像Action一样,但函数指针AddressOf单独不能。

DataGridView1.Invoke(Sub() UpdateDgv0())
DataGridView1.Invoke(Sub() UpdateDgv1(New Object()))
DataGridView1.Invoke(Sub() UpdateDgv2(New Object(), New EventArgs()))

由于使用的是 .NET 3.0,因此不会看到 3.5 中引入的无参数Action。您可以非常简单地创建自己的操作委托。将其添加到原始代码中也可以解决问题

Private Delegate Sub Action()

它优于DataGridView1.Invoke(Sub() UpdateDgv())方法,因为它涉及对堆栈跟踪的调用少一次(尽管编译器可能会对其进行优化,但我不确定)。

最新更新