在VB.NET中添加事件处理程序的语法

时间:2013-07-07 10:05:31

标签: .net vb.net event-handling c#-to-vb.net

我有以下代码需要转换为VB.NET。问题是我找到的每个翻译工具都是错误地转换添加处理程序部分。我自己似乎无法做到这一点。

FtpClient ftpClient = new FtpClient();
ftpClient.UploadProgressChanged += new EventHandler<UploadProgressChangedLibArgs>(ftpClient_UploadProgressChanged);
ftpClient.UploadFileCompleted += new EventHandler<UploadFileCompletedEventLibArgs>(ftpClient_UploadFileCompleted);

1 个答案:

答案 0 :(得分:19)

有两种不同的方法可以将事件处理程序方法与VB.NET中的事件相关联。

第一个涉及使用Handles关键字,您将其附加到事件处理程序方法的定义的末尾。例如:

Sub ftpClient_UploadProgressChanged(sender As Object, e As UploadProgressChangedLibArgs) Handles ftpClient.UploadProgressChanged
    ' ...
End Sub

Sub ftpClient_UploadFileCompleted(sender As Object, e As UploadFileCompletedEventLibArgs) Handles ftpClient.UploadFileCompleted
    ' ...
End Sub

如果您已经有了单独定义的事件处理程序方法(即,如果您没有使用lambda语法),则第一种方法会简单得多。我会尽可能地推荐它。

第二个涉及明确使用AddHandler语句,就像C#中的+=一样。如果要动态关联事件处理程序 ,则需要使用此选项。如果你需要在运行时更改它们。所以你的代码,字面转换,看起来像这样:

Dim ftpClient As New FtpClient()
AddHandler ftpClient.UploadProgressChanged, AddressOf ftpClient_UploadProgressChanged
AddHandler ftpClient.UploadFileCompleted, AddressOf ftpClient_UploadFileCompleted

就像你说的那样,我尝试通过Developer Fusion's converter运行你的代码,并惊讶地发现他们返回了无效的VB.NET代码:

' WRONG CODE!
Dim ftpClient As New FtpClient()
ftpClient.UploadProgressChanged += New EventHandler(Of UploadProgressChangedLibArgs)(ftpClient_UploadProgressChanged)
ftpClient.UploadFileCompleted += New EventHandler(Of UploadFileCompletedEventLibArgs)(ftpClient_UploadFileCompleted)

事实证明,a known bug可能值得投票!