我有一个包含两种类型数据的表单:
- 显示表单时必须显示的当前数据
- 历史数据,如果用户点击专用按钮可能会显示。这两种类型都来自数据库。
由于历史数据可能需要更多的时间来获取,我希望在显示表单后获得它们。
表单通过以下方式打开:
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
WithGetHistoricalDatas
like:
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作为字符串,_strplatform作为字符串)作为DataTable'没有签名与委托' frmnotifeugc . doworkdelegate '兼容。我不明白是什么原因导致这个问题考虑到tblHistoricalDatas是一个数据表和gethhistoricaldatas返回一个数据表
我错过了什么?Precision:GetHistoricalDatas
不在form code中,此函数位于项目的其他位置。但是,因为它是一个公共函数,我假设(也许我错了),这不会是一个问题。
不能使用具有不同签名的委托调用方法。你的方法是一个具有两个String
参数的Function
,并返回一个DataTable
,而你的委托是一个没有参数的Sub
。您应该使用与您打算调用的方法相同的签名声明您的委托:
Public Delegate Function DoWorkDelegate(p1 As String, p2 As String) As DataTable
请注意,参数名称实际上并不重要,但您应该给它们起合适的名称,就像其他所有内容一样。如果委托只用于调用一个方法,则使用与该方法相同的参数名。
也就是说,现在没有什么必要声明你自己的委托。要调用Sub
,请使用合适的Action
委托;要调用Function
,请使用合适的Func
委托。都可以有最多16个参数。
请注意,这解决了你问的具体问题,但你的代码仍然存在问题,这绝对不是我要做的。