将C#(带有类型化事件)转换为VB.NET
我有一个ASPX页面(使用VB Codebehind)。 我想扩展GridView类,以便在没有返回任何行时显示页眉/页脚。
我在网上找到了一个C#示例( 链接 )( 来源 )。 但是,我无法将其转换为VB,因为它使用了类型化事件(在VB中不合法)。
我已经在线尝试了几个免费的C#到VB.NET转换器,但没有一个有效。
请将示例转换为VB.NET或提供扩展GridView类的替代方法。
备注/困难:
-
如果
DataView
对象出错,请将类型指定为System.Data.DataView
,类型比较可能如下:If data.[GetType]() Is GetType(System.Data.DataView) Then
-
由于事件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#代码编译为库。
- 创建一个新项目(C#类库)并将其命名为“AlwaysShowHeaderFooter”
- 将文件从App_Code移动到新项目
- 添加对System.Web和System.Configuration的引用
- 将Web项目中的引用添加到“AlwaysShowHeaderFooter”的已编译dll中,或者将项目本身作为引用添加到同一解决方案中。
- 切换
<%@ 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参数。