代码之家  ›  专栏  ›  技术社区  ›  Steven

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

  •  1
  • Steven  · 技术社区  · 15 年前

    我有一个ASPX页面(VB代码隐藏)。我想扩展GridView类,以便在不返回任何行时显示页眉/页脚。

    link ) ( source

    我在网上试过几个免费的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 没有返回值),如何将其与 Nothing 在函数中 OnMustAddARow() ?

    下面是一个示例,其中包含(希望)相关代码以帮助回答问题。

    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;
        }
    }
    
    4 回复  |  直到 15 年前
        1
  •  1
  •   Mikael Svenson    15 年前

    正如我在评论中所说,代码不会“神奇地”转换成VB.Net。这将需要通过它工作,让它正确编译。

    最简单的方法是将C代码编译成一个库。

    1. 图书馆)并将其命名为“AlwaysShowHeaderFooter”
    2. 添加对System.Web和System.Configuration的引用
    3. 关闭 <%@ Register TagPrefix="Custom" Namespace="AlwaysShowHeaderFooter" %> 具有 <%@ Register Assembly="AlwaysShowHeaderFooter" Namespace="AlwaysShowHeaderFooter" TagPrefix="Custom" %>

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

        2
  •  1
  •   Eric Haley    15 年前

    请看 here

    对于VB来说,没有确切的等价物。

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

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

        3
  •  1
  •   MEMark    15 年前

    关于1,最干净的VB方法是

    If TypeOf data Is System.Data.DataView Then
    
        4
  •  0
  •   Hans Olsson    15 年前