2013-07-07 7 views
6

Ich habe folgenden Code, den ich in VB.NET konvertieren muss. Das Problem ist, dass jedes Übersetzungstool, das ich gefunden habe, den Add-Handler-Teil falsch konvertiert. Ich scheine es nicht alleine zu schaffen.Syntax für das Hinzufügen eines Ereignishandlers in VB.NET

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

Antwort

10

Es gibt zwei verschiedene Möglichkeiten, Ereignisbehandlungsmethoden mit einem Ereignis in VB.NET zu verknüpfen.

Bei der ersten wird das Schlüsselwort Handles verwendet, das Sie an das Ende der Definition der Event-Handler-Methode anhängen. Zum Beispiel:

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 

Die erste Methode ist viel einfacher, wenn Sie bereits separat sowieso Event-Handler-Methoden definiert wurden (das heißt, wenn Sie nicht eine Lambda-Syntax). Ich würde es empfehlen, wann immer es möglich ist.

Die zweite beinhaltet die explizite Verwendung der AddHandler-Anweisung, genau wie += in C#. Dies ist die, die Sie verwenden müssen, wenn Sie Ereignishandler dynamisch, z. wenn Sie sie zur Laufzeit ändern müssen. So Ihr Code, buchstäblich umgewandelt, würde wie folgt aussehen:

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

Wie du gesagt hast, habe ich versucht, den Code durch Developer Fusion's converter laufen und war überrascht zu sehen, dass sie ungültig VB.NET-Code zurückkehrten:

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

Stellt sich heraus, das ist a known bug, die es wert sein könnte, zu wählen!

+0

vielen Dank! erschöpfende Antwort und sehr klar! :) – sharkyenergy

+0

ich bekomme diesen Fehler jetzt, was bedeutet das? danke Fehler Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert ist. – sharkyenergy

+1

@Justme Verwenden Sie das Handles-Schlüsselwort am Ende einer Prozedurdeklaration, damit es Ereignisse behandelt, die von einer Objektvariablen ausgelöst werden mit dem Schlüsselwort ** WithEvents ** deklariert. http://msdn.microsoft.com/library/vstudio/6k46st1y – Chris