我不明白此datagridview的语法应为new action invoke命令

时间:2019-07-08 16:23:37

标签: vb.net datagridview invoke

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

我搜索了很多与Invoke和New Action相关的Google参考,并尝试了各种代码迭代,但是由于即使在阅读Microsoft文档和论坛参考之后,我也不完全理解Invoke New Action语句,所以我可以t使语法正确。

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

在运行程序时,我收到'System.Action(T)的类型参数太少'的错误,而最近的一次是将错误行更改为

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

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

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试将带有参数的方法的地址传递到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。您可以使您自己的Action委托非常简单。将其添加到原始代码中也可以解决问题

Private Delegate Sub Action()

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