【问题标题】:Syntax for adding an event handler in VB.NET在 VB.NET 中添加事件处理程序的语法
【发布时间】:2013-07-07 10:05:31
【问题描述】:

我有以下代码需要转换为 VB.NET。问题是我发现的每个翻译工具都将添加处理程序部分转换错了。我自己好像做不到。

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

【问题讨论】:

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


    【解决方案1】:

    在 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 可能值得投票!

    【讨论】:

    • 我现在收到这个错误,这是什么意思?谢谢Error 1 Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
    • @Justme 在过程声明的末尾使用 Handles 关键字,使其处理由使用 WithEvents 关键字声明的对象变量引发的事件。 msdn.microsoft.com/library/vstudio/6k46st1y
    • 感谢您的回答!现在它的工作..我有另一个问题很棘手..因为上传者正在另一个线程上工作,事件调用的子也在另一个线程上执行。我可以强制那个在主线程上运行吗?我需要它来访问界面..
    • @Just 要在 UI 线程上运行代码或与控件交互,请使用 Invoke 方法。这里已经有很多关于此的信息,例如this question
    • 以及如何将 `Public Event UploadProgressChanged As EventHandler(Of UploadProgressChangedLibArgs)` 设置为正确的句子?在线它仍然是错误的..谢谢
    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多