问题描述
我有一个应用程序,其应用程序的主窗口在单击按钮时为用户提供了一个选项,可以将其加载到云中的文件列表中。
Private Sub ImportCloudContent()
Dim cloudForm As Form_CloudImport
cloudForm = New Form_CloudImport()
cloudForm.Show()
cloudForm.populateDataGrid()
AddHandler cloudForm._DownloadComplete,New EventHandler(AddressOf OpenProject)
cloudForm.DownloadNotifier(FullPathOfContent)
End Sub
理想情况下,我应该能够获取 FullPathOfContent 变量的值并将其传递给Open Project,但我不确定该怎么做。
在新窗口中,用户可以单击并下载所需的文件。以下是处理Form_CloudImport类中的下载的代码部分:
Private Async Sub Btn_download_Click(sender As Object,e As EventArgs) Handles Btn_download.Click
Dim fileNameRows As DataGridViewSelectedRowCollection = datagridview_cloudContent.SelectedRows
Dim fileName As String
Dim fileType As String = Cloud.CONTENT
Dim FullPathOfContent As String
For Each fileNameRow As DataGridViewRow In fileNameRows
fileName = fileNameRow.Cells(0).Value.ToString() & ".zip"
Try
FullPathOfContent = CloudToCCT(fileName,fileType)
Catch ex As Exception
CSMessageBox.ShowError("Content Import Failed : ",ex)
End Try
Next
Me.Close()
DownloadNotifier(FullPathOfContent)
End Sub
下载完成后,主窗口需要调用其某些方法。我是VB的新手,并创建了一个自定义事件来简化此操作(同样在Form_CloudImport类中)
Public Event _DownloadComplete(e As String)
Public Sub DownloadNotifier(FullPathOfContent As String)
RaiseEvent _DownloadComplete(FullPathOfContent)
End Sub
根据已阅读的内容,一旦下载方法完成,它将触发 DownloadNotifier 方法,这将引发 _DownloadComplete 事件,并且MainWindow应触发以下内容事件。
Value of type 'MainWindow.EventHandler' cannot be converted to 'Form_CloudImport._DownloadCompleteEventHandler'
和
'FullPathOfContent' is not declared. It may be inaccessible due to its protection level.
这个问题似乎很长,但任何帮助将不胜感激。预先谢谢你!
解决方法
首先,您应该创建一个具有正确名称和签名的类型和事件,并正确引发它。
Public Class CloudImportForm
Public Event DownloadComplete As EventHandler(Of DownloadCompleteEventArgs)
Protected Overridable Sub OnDownloadComplete(e As DownloadCompleteEventArgs)
RaiseEvent DownloadComplete(Me,e)
End Sub
'...
End Class
Public Class DownloadCompleteEventArgs
Inherits EventArgs
Public Sub New(contentPath As String)
Me.ContentPath = contentPath
End Sub
Public ReadOnly Property ContentPath As String
End Class
在这种形式下,您将具有执行下载然后引发该事件的代码。
'...
Dim contentPath = GetContentPath()
'Perform download here.
'Raise event.
OnDownloadComplete(New DownloadCompleteEventArgs(contentPath))
在主表单中,您将创建并配置下载表单,其中包括处理事件,然后显示它。
Dim cloudForm As New CloudImportForm
AddHandler cloudForm.DownloadComplete,AddressOf CloudImportForm_DownloadComplete
cloudForm.PopulateDataGrid()
cloudForm.Show()
您指定为事件处理程序的方法应具有适当的签名,并且应从e
参数中检索内容路径。
Private Sub CloudImportForm_DownloadComplete(sender As Object,e As DownloadCompleteEventArgs)
Dim contentPath = e.ContentPath
'Use contentPath here.
End Sub