【问题标题】:VB Equivalent of C# Event CreationC# 事件创建的 VB 等价物
【发布时间】:2010-04-30 22:31:51
【问题描述】:

我正在尝试使用我在网上找到的代码 (link) 扩展 GridView 类以始终显示页眉和页脚,即使数据源为空也是如此。但是,代码是用 C# 编写的,但我使用的是 VB。

下面的 VB 等价物是什么?

public event MustAddARowHandler MustAddARow;

有没有办法绕过 VB.NET 不允许事件返回类型?

另外,由于下面的错误,我无法转换以下函数。

代码:

Protected Function OnMustAddARow(ByVal data As IEnumerable) As IEnumerable
    If MustAddARow = Nothing Then 'Error on MustAddARow'
        Throw New NullReferenceException("The datasource has no rows.  You " _
                                        & "must handle the 'MustAddARow' Event.")
    End If
    Return MustAddARow(data) 'Error on MustAddARow'
End Function

错误: Public Event MustAddARow(data As System.Collections.IEnumerable)' 是一个事件,不能直接调用。使用“RaiseEvent”语句来引发事件。

【问题讨论】:

    标签: c# asp.net vb.net events


    【解决方案1】:

    像这样:

    Public Event MustAddRow(data As IEnumerable)
    

    【讨论】:

    • 原行中的“MustAddARowHandler”呢?
    • VB.Net 编译器会自动生成委托类型。
    • SLaks 是对的,但还有另一种方式:Public Event MustAddRow as MustAddRowHandler
    • 添加“as MustAddRowHandler”会导致以下错误:事件不能有返回类型。
    • 是的,因为在 VB 中事件不能返回任何东西。他们只提出、添加处理程序和删除处理程序。我很惊讶在 C# 中他们可以。如果有 c# 知识的人能准确解释您链接的代码中发生了什么,我将不胜感激。
    【解决方案2】:

    注意:这个答案实际上是错误的。我的错。显示的语法是正确的(这就是我不会立即删除此答案的原因),但它不会编译,因为事件(通常是多播委托)不允许在 VB 中返回值.NET。


    事件声明:

    Public Event MustAddRow As MustAddRowHandler
    

    委托类型声明:(这是上面的先决条件)

    Public Delegate Function MustAddRowHandler(ByVal data As IEnumerable) As IEnumerable
    

    【讨论】:

    • 错误:无法使用具有返回类型的委托类型声明事件。
    • 什么是多播委托,它们与单播委托有何不同?在 VB 中,所有委托都有一个调用列表,也就是说 - 它们都可以调用多个目标方法。
    • @M.A. Hanin:AFAIK,默认情况下代表是多播的。我什至不确定是否可以定义单播委托,因为实现委托的 .NET 类以特殊方式受到保护。我无法对此给出明确的答案,但我怀疑 VB.NET 只会接受 Sub 代表,即那些不返回任何值的代表。 -- 另请参阅我在另一个答案中的评论。
    【解决方案3】:

    正如我在另一篇帖子 (link) 的回答中所描述的,我将 C# 代码编译成我在 VB 代码中使用的 DLL。

    【讨论】:

      猜你喜欢
      • 2017-12-20
      • 2011-03-09
      • 2019-04-01
      • 2015-11-02
      • 1970-01-01
      • 2011-03-18
      • 2022-06-11
      • 1970-01-01
      • 2019-02-25
      相关资源
      最近更新 更多