首页 > 解决方案 > 将项目从 VB.Net 转换为 C# 后,不会触发用 .cs 页面编写的事件

问题描述

我已经使用SharpDevelop将一个大型的 ASp.Net Web 表单项目从 VB.Net 转换为 C# ,并且能够在修复所有错误后编译该项目(准确地说是 2100 在我的情况下)。

当我执行代码时,我注意到 .aspx 页面工作正常,但是没有任何从 .vb 文件转换为 .cs 文件的事件被触发。对于前 -Page_Load / btn_click等,我已将事件处理程序定义从更改为Private void Function()protected void Function()但仍然存在相同的问题。有人可以建议如何解决这个问题吗?

提前致谢。

标签: c#asp.netvb.netmigration

解决方案


VB.Net事件中附加内联事件处理程序方法签名。例如

YoueventHandler(object, sender) Handles button1.Click

当您将vb.net代码转换为C#使用任何转换器时,处理程序将被转换,但事件处理程序注册将消失。您必须使用 C# 中的事件重新注册这些事件处理程序。

这是 Linqpad 脚本,可帮助您扫描 VB 文件中的事件并为其生成 C# 处理程序。

void Main()
{
    var file = @"youcodeFile.vb";
    Regex r = new Regex(@"Sub (?<evthandler>[\S]+)\(.*\)\s?Handles\s?(?<eventName>[\S]+)");
    var events = r.Matches(File.ReadAllText(file)).Cast<Match>().Select(x => new { Event = x.Groups["eventName"].Value, Handler = x.Groups["evthandler"].Value});
    events.Dump();

    events.Select(x => $"{x.Event} += {x.Handler};").Dump();
}

扫描事件:

在此处输入图像描述

C# 输出:

Me.Load += frmOutlookSyncStatus_Load; 
btnGo.Click += BtnGo_Click; 
btnLookupCase.Click += BtnLookupCase_Click; 
RepositoryItemButtonEdit1.Click += RepositoryItemButtonEdit1_Click; 
GridView1.CustomRowCellEdit += GridView1_CustomRowCellEdit; 
GridView1.CustomUnboundColumnData += gridViewEvents_CustomUnboundColumnData; 

推荐阅读