将带有参数的下载完成事件传递给另一个类

问题描述

我有一个应用程序,其应用程序的主窗口在单击按钮时为用户提供了一个选项,可以将其加载到云中的文件列表中。

 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应触发以下内容事件。

但是,我在代码的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