У меня есть форма с двумя типами данных:
Поскольку для получения исторических данных может потребоваться больше времени, я хотел бы получить их после отображения формы.
Форма открывается через это:
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
отсутствует в коде формы, эта функция находится в другом месте проекта. Но, поскольку это общедоступная функция, я предполагаю (может быть, я ошибаюсь), это не будет проблемой.
Я ничего не "подумал", поэтому и спросил. Я изо всех сил старался придерживаться правил СД, избегая вопросов «как». Я пытался добавить контекстную информацию, ссылки, источники, пояснения, а вы ответили смесью снисходительности и насмешки. Так что, пожалуйста, простите меня за то, что я... новичок, задающий некоторые не относящиеся к делу вопросы. Это как если бы вы смотрели, как ребенок пытается научиться ходить, спрашивали, что он делает неправильно, и вы отвечали бы ему: «Почему ты так двигаешь ногами? Что ты делаешь с руками? А как насчет обуви? Это не прогулочная обувь. Это так неправильно».
Так как когда спрашивать кого-то, что они думают или думают, представляет собой снисходительность и насмешку? -- Вы разместили свой первый вопрос о VB.NET в Dec 4, 2020
, так что вы не такой уж новичок, и я не отношусь к взрослым, как к малышам, это было бы снисхождением и насмешкой. Я задавал существенные вопросы, которые указывают на проблемы, которые вам придется решать
Вы не можете вызвать метод, используя делегат с другой сигнатурой. Ваш метод представляет собой Function
с двумя параметрами String
и возвращает DataTable
, в то время как ваш делегат представляет собой Sub
без параметров. Вы должны объявить своего делегата с той же подписью, что и метод, который вы собираетесь вызывать:
Public Delegate Function DoWorkDelegate(p1 As String, p2 As String) As DataTable
Обратите внимание, что имена параметров на самом деле не имеют значения, но вы должны дать им соответствующие имена, как и всему остальному. Если делегат будет использоваться только для вызова одного метода, используйте те же имена параметров, что и метод.
Тем не менее, в наши дни действительно мало смысла объявлять своих собственных делегатов. Чтобы вызвать Sub
, используйте соответствующий делегат Action
, а для вызова Function
используйте соответствующий делегат Func
. Оба могут иметь до 16 параметров.
Обратите внимание, что это относится к конкретному вопросу, который вы задали, но с вашим кодом все еще есть проблемы, и я бы определенно не стал этого делать.
Вы думаете, что объявление этого:
Public Delegate Sub DoWorkDelegate()
соответствует этому:Function GetHistoricalDatas(_strUserId As String, _strPlatforme As String) As DataTable
? Для чего этот делегат? Вам это действительно нужно? Разве вы не можете просто использовать лямбду? -- Зачем ты звонишьBeginInvoke()
туда? -- Какой смысл в этом:Friend WithEvents strIdUgcToDisplay As String
?