2013-07-07 35 views
6

我需要將以下代碼轉換爲VB.NET。問題在於,我發現每個翻譯工具都會將添加處理程序部分轉換爲錯誤。我自己似乎無法做到。在VB.NET中添加事件處理函數的語法

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

回答

10

有兩種不同的方法將事件處理程序方法與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

+0

非常感謝你!詳盡的答案和非常明確! :) – sharkyenergy

+0

我現在得到這個錯誤,這是什麼意思?謝謝'錯誤句柄子句要求在包含類型或其基類型中定義一個WithEvents變量。' – sharkyenergy

+1

@Justme在過程聲明的末尾使用Handles關鍵字來使它處理由對象變量引發的事件使用** WithEvents **關鍵字聲明。 http://msdn.microsoft.com/library/vstudio/6k46st1y – Chris

相關問題