【问题标题】:Convert event delegate from c# to vb.net, calling the delegate instead of raising the event将事件委托从 c# 转换为 vb.net,调用委托而不是引发事件
【发布时间】:2016-02-04 04:54:41
【问题描述】:

我已经在网上搜索以找到解决方案,但我只能摸不着头脑。这是代码,在 c# 中我正在尝试转换为 vb.net。代码如下:

    internal event EventHandler ShellItemUpdated;

    #region internal interface
    protected virtual TreeNodePath CreateTreeNode(System.Windows.Forms.TreeNodeCollection parentCollection, TreeNodePath parentNode, Tppon.Win32.ShellItem shellItem)
    {
        if (shellItem == null) throw new ArgumentNullException("shellItem");
        //
        TreeNodePath node = CreateTreeNode(parentCollection, parentNode, shellItem.Text, shellItem.Path, !shellItem.IsFolder, shellItem.HasSubfolder, !shellItem.IsFileSystem);
        node.ImageIndex = shellItem.ImageIndex;
        node.SelectedImageIndex = shellItem.SelectedImageIndex;
        node.Tag = shellItem;
        //
        shellItem.ShellItemUpdated += delegate(object sender, EventArgs e)
        {
            node.Text = shellItem.Text;
            node.ImageIndex = shellItem.ImageIndex;
            node.SelectedImageIndex = shellItem.SelectedImageIndex;                
        };
        return node;
    }

当我尝试手动转换它时,我不断收到有关引发事件的错误。所以我使用了网络上的一种转换器工具,它给了我这个:

    Friend Event ShellItemUpdated As EventHandler

    Protected Overridable Function CreateTreeNode(parentCollection As System.Windows.Forms.TreeNodeCollection, parentNode As TreeNodePath, shellItem As Tppon.Win32.ShellItem) As TreeNodePath
    If shellItem Is Nothing Then
      Throw New ArgumentNullException("shellItem")
    End If
    '
    Dim node As TreeNodePath = CreateTreeNode(parentCollection, parentNode, shellItem.Text, shellItem.Path, Not shellItem.IsFolder, shellItem.HasSubfolder, _
    Not shellItem.IsFileSystem)
    node.ImageIndex = shellItem.ImageIndex
    node.SelectedImageIndex = shellItem.SelectedImageIndex
    node.Tag = shellItem
    '
    shellItem.ShellItemUpdated += Sub(sender As Object, e As EventArgs) 
    node.Text = shellItem.Text
    node.ImageIndex = shellItem.ImageIndex
    node.SelectedImageIndex = shellItem.SelectedImageIndex

  End Sub
  Return node
End Function

这显然是不正确的,因为我不是在这里提出事件。我从来没有在 vb 中使用过委托,所以这对我来说是个黑洞。

它专门抱怨这一行:

shellItem.ShellItemUpdated += Sub(sender As Object, e As EventArgs) 

并说我需要发起一个事件。但我想打电话给代表,而不是引发事件!而且看起来整个功能都是胡言乱语。非常感谢那里的一些天才帮助我正确转换此代码 sn-p...

【问题讨论】:

  • AddHandler shellItem.ShellItemUpdated, Sub(...?

标签: c# asp.net vb.net delegates event-handling


【解决方案1】:

在您的 C# 代码中,您没有调用委托,而是将事件处理程序附加到 ShellItemUpdated 事件。

相当于添加事件处理程序的VB 是AddHandler。假设您想要与 C# 代码中相同的功能,则此代码应该可以工作:

AddHandler shellItem.ShellItemUpdated, Sub(sender As Object, e As EventArgs) 
    node.Text = shellItem.Text
    node.ImageIndex = shellItem.ImageIndex
    node.SelectedImageIndex = shellItem.SelectedImageIndex
End Sub

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多