【问题标题】:Convert C# (with typed events) to VB.NET将 C#(带有类型事件)转换为 VB.NET
【发布时间】:2010-04-22 20:06:36
【问题描述】:

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

我在网上找到了一个 C# 示例 (link) (source)。但是,我无法将其转换为 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;
    }
}

【问题讨论】:

  • 如果您在问题本身中包含“类型化事件”的示例,我会提供帮助。
  • 如果您编译代码并在 Reflector 中查看,您可以切换到 VB.Net 视图。无需在线转换器。
  • @Mikael:我无法让 Reflector 转换代码。提交等效的工作 VB 代码作为答案,我会接受。
  • @Steven,我试过试一试,但是我今天的VB技术和耐心都达不到它:)但我确定它可以转换,但你必须更改代码有点让它运行。反射器出口不会削减它。也许在 C# 中创建这部分并链接它更容易。
  • @Mikael:我如何链接它?不妨提交作为答案。

标签: c# vb.net visual-studio-2008


【解决方案1】:

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

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

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

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

【讨论】:

  • 我构建了 DLL,添加了 DLL 作为参考,在我的Default.aspx 顶部添加了您的“<code> 和 &lt;del&gt; 之间)时,IntelliSense 中没有显示控件。我做错了什么?
  • 我明白了。我在 中将 添加到我的 web.config 中。感谢您的帮助!
【解决方案2】:

请参阅here

对于 VB,没有完全等价的。

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

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

【讨论】:

    【解决方案3】:

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

    If TypeOf data Is System.Data.DataView Then
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2018-02-01
        • 2011-01-31
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多