BC31143 Ошибка при использовании делегата при загрузке формы

У меня есть форма с двумя типами данных:

  • текущие данные, которые должны отображаться при отображении формы
  • исторические данные, которые могут отображаться, если пользователь нажимает на специальную кнопку. Оба типа пришли из базы данных.

Поскольку для получения исторических данных может потребоваться больше времени, я хотел бы получить их после отображения формы.

Форма открывается через это:

Public Sub DisplayUgc(_strIdUgcToDisplay As String, _strPlatformUgcToDisplay As String)
   Dim frmUgcNotice as New frmNoticeUgc
   If IsMyFormOpened(frmUgcNotice) = False Then
      frmUgcNotice.strIdUgcToDisplay = _strIdUgcToDisplay
      frmUgcNotice.strPlatformUgcToDisplay = _strPlatformUgcToDisplay
      frmUgcNotice.Show()
   Else
      MsgBox(strMsgNoticeAlreadyOpened, MsgBoxStyle.Exclamation, strMsgBoxGeneralErrorTitle)
      Exit Sub
   End If

'[...Then, some code where every other controls in the form is set...]

Итак, чтобы получить то, что я хотел и следуя этому посту, я сделал это:

Public Class frmNoticeUgc
    Inherits Form

    Public Delegate Sub DoWorkDelegate()

    Public Sub New()
        InitializeComponent()
    End Sub    
    Friend tblHistoricalDatas As New DataTable  ' Historical Datas
    Friend WithEvents strIdUgcToDisplay As String
    Friend WithEvents strPlatformUgcToDisplay As String
    Private Sub frmNoticeUgc_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        
        InitUgcCombobox()
        InitUgcDatagrid()

        Select Case Me.btnValidation.Text
            Case "Ajouter"
                SetFormControls("add")
            Case "Modifier"
                Me.tblHistoricalDatas  = BeginInvoke(New DoWorkDelegate(AddressOf GetHistoricalDatas(Me.strIdUgcToDisplay, Me.strPlatforme))
                SetFormControls("modify")
        End Select
        SetFormColor(Me)

    End Sub

С GetHistoricalDatas нравится:

Public Function GetHistoricalDatas(_strUserId As String, _strPlatforme As String) As DataTable
      Dim tblGetAllVersions As Datatable
      ' [...] Some code to get the historical datas

       Return tblGetAllVersions
        
End Function

Проблема: у меня есть BC31143, метод «Общедоступная функция GetHistoricalDatas (_strUserId As String, _strPlatforme As String) As DataTable» не имеет подписи, совместимой с делегатом «frmNoticeUgc.DoWorkDelegate». Я не понимаю, что вызывает эту проблему, поскольку tblHistoricalDatas является таблицей данных, а GetHistoricalDatas возвращает таблицу данных.

Что я пропустил?

Точность: GetHistoricalDatas отсутствует в коде формы, эта функция находится в другом месте проекта. Но, поскольку это общедоступная функция, я предполагаю (может быть, я ошибаюсь), это не будет проблемой.

Вы думаете, что объявление этого: Public Delegate Sub DoWorkDelegate() соответствует этому: Function GetHistoricalDatas(_strUserId As String, _strPlatforme As String) As DataTable? Для чего этот делегат? Вам это действительно нужно? Разве вы не можете просто использовать лямбду? -- Зачем ты звонишь BeginInvoke() туда? -- Какой смысл в этом: Friend WithEvents strIdUgcToDisplay As String?

Jimi 16.01.2023 12:24

Я ничего не "подумал", поэтому и спросил. Я изо всех сил старался придерживаться правил СД, избегая вопросов «как». Я пытался добавить контекстную информацию, ссылки, источники, пояснения, а вы ответили смесью снисходительности и насмешки. Так что, пожалуйста, простите меня за то, что я... новичок, задающий некоторые не относящиеся к делу вопросы. Это как если бы вы смотрели, как ребенок пытается научиться ходить, спрашивали, что он делает неправильно, и вы отвечали бы ему: «Почему ты так двигаешь ногами? Что ты делаешь с руками? А как насчет обуви? Это не прогулочная обувь. Это так неправильно».

8oris 16.01.2023 17:15

Так как когда спрашивать кого-то, что они думают или думают, представляет собой снисходительность и насмешку? -- Вы разместили свой первый вопрос о VB.NET в Dec 4, 2020, так что вы не такой уж новичок, и я не отношусь к взрослым, как к малышам, это было бы снисхождением и насмешкой. Я задавал существенные вопросы, которые указывают на проблемы, которые вам придется решать

Jimi 16.01.2023 22:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете вызвать метод, используя делегат с другой сигнатурой. Ваш метод представляет собой Function с двумя параметрами String и возвращает DataTable, в то время как ваш делегат представляет собой Sub без параметров. Вы должны объявить своего делегата с той же подписью, что и метод, который вы собираетесь вызывать:

Public Delegate Function DoWorkDelegate(p1 As String, p2 As String) As DataTable

Обратите внимание, что имена параметров на самом деле не имеют значения, но вы должны дать им соответствующие имена, как и всему остальному. Если делегат будет использоваться только для вызова одного метода, используйте те же имена параметров, что и метод.

Тем не менее, в наши дни действительно мало смысла объявлять своих собственных делегатов. Чтобы вызвать Sub, используйте соответствующий делегат Action, а для вызова Function используйте соответствующий делегат Func. Оба могут иметь до 16 параметров.

Обратите внимание, что это относится к конкретному вопросу, который вы задали, но с вашим кодом все еще есть проблемы, и я бы определенно не стал этого делать.

Другие вопросы по теме