Я не понимаю, какой синтаксис должен быть для этой таблицы данных. - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь сгенерировать программу для отслеживания изменений в файле базы данных и возврата последних 10 записей в списке просмотра данных.

Я искал множество ссылок Google, касающихся Invoke и NewДействие и пробовал различные итерации кода, но так как я не до конца понимаю заявление Invoke New Action даже после прочтения документов Microsoft и ссылок на форумы, я не могу сделать правильный синтаксис.

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

Я получаюошибка 'Слишком мало аргументов типа' System.Action (Of T) 'при запуске программы, и самое близкое, что я получил, - это изменение строки ошибки на

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

, что, похоже, является исправленным синтаксисом(?) но я не знаю что за ????должно быть.

1 Ответ

0 голосов
/ 08 июля 2019

Похоже, вы пытаетесь передать адрес метода с аргументами в конструктор 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, вы не увидите без параметров Action, который был представлен в 3.5. Вы можете сделать свой собственный делегат Action довольно просто. Добавление этого к вашему исходному коду также решило бы проблему

Private Delegate Sub Action()

Он превосходит подход DataGridView1.Invoke(Sub() UpdateDgv()), поскольку включает в себя на один вызов меньше трассировки стека (хотя компилятор может оптимизировать его, я не уверен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...