将C#(带有类型化事件)转换为VB.NET

我有一个ASPX页面(使用VB Codebehind)。 我想扩展GridView类,以便在没有返回任何行时显示页眉/页脚。

我在网上找到了一个C#示例( 链接 )( 来源 )。 但是,我无法将其转换为VB,因为它使用了类型化事件(在VB中不合法)。

我已经在线尝试了几个免费的C#到VB.NET转换器,但没有一个有效。

请将示例转换为VB.NET或提供扩展GridView类的替代方法。

备注/困难:

  1. 如果DataView对象出错,请将类型指定为System.Data.DataView ,类型比较可能如下: If data.[GetType]() Is GetType(System.Data.DataView) Then

  2. 由于事件MustAddARow不能在VB中有一个类型(并且RaiseEvent event没有返回值),如何将它与函数OnMustAddARow()中的Nothing进行比较?

编辑:

以下是一个带有(希望)相关代码的示例,以帮助回答问题。

 namespace AlwaysShowHeaderFooter { public delegate IEnumerable MustAddARowHandler(IEnumerable data); public class GridViewAlwaysShow : GridView { // Various member functions omitted // protected IEnumerable OnMustAddARow(IEnumerable data) { if (MustAddARow == null) { throw new NullReferenceException("The datasource has no rows. You must handle the \"MustAddARow\" Event."); } return MustAddARow(data); } public event MustAddARowHandler MustAddARow; } } 

正如我在评论中所说,代码不会“神奇地”转换为VB.Net。 它需要通过它来使其正确编译。

最简单的方法是将C#代码编译为库。

  1. 创建一个新项目(C#类库)并将其命名为“AlwaysShowHeaderFooter”
  2. 将文件从App_Code移动到新项目
  3. 添加对System.Web和System.Configuration的引用
  4. 将Web项目中的引用添加到“AlwaysShowHeaderFooter”的已编译dll中,或者将项目本身作为引用添加到同一解决方案中。
  5. 切换<%@ Register TagPrefix="Custom" Namespace="AlwaysShowHeaderFooter" %> with <%@ Register Assembly="AlwaysShowHeaderFooter" Namespace="AlwaysShowHeaderFooter" TagPrefix="Custom" %>

现在,您已将控件拆分为自己的项目,可在任何.Net项目中引用。

请看这里 。

对于VB,没有完全相同的。

请使用带有“ByRef”参数的“Sub”委托。

后续答案给出了一个有效的例子,但解释了为什么这是一个坏主意。

关于1,最干净的VB方式

 If TypeOf data Is System.Data.DataView Then 

关于2.我认为VB.Net中的事件可以传递ByRef参数。