VS2008 ASP.NET网站报错:Handles子句需定义WithEvents变量
解决VB.NET中“Handles clause requires a WithEvents variable”错误
作为从C#转VB.NET、刚上手VS2008的开发者,这个错误其实是VB.NET事件绑定机制和C#最直观的差异之一,我来给你拆解下解决方案:
先搞懂错误根源
在VB.NET里,用Handles关键字绑定事件时,要求对应的控件/对象变量必须用WithEvents关键字声明——这个变量得是当前类或者它的基类里定义的。而你之前用C#习惯了+=直接订阅事件,不需要额外的关键字,所以刚转过来很容易踩这个坑。
具体解决步骤
检查变量声明的
WithEvents关键字- 找到报错的
Handles对应的变量(比如你写了Handles btnSave.Click,就找btnSave的声明)。 - 如果是窗体上的控件,它的声明默认在对应的
.Designer.vb文件里(VS2008里这个文件默认隐藏,你需要在解决方案资源管理器里点击「显示所有文件」才能看到)。正常情况下,设计师生成的控件声明会自动带WithEvents,比如:
如果这个声明里少了Friend WithEvents btnSave As System.Windows.Forms.ButtonWithEvents,加上就行。 - 如果是你手动在代码里添加的对象变量(比如自定义类的实例),一定要手动加上
WithEvents,比如:Private WithEvents myCustomObject As MyCustomClass
- 找到报错的
用
AddHandler替代Handles(更贴近C#的习惯)
如果你不想纠结WithEvents,可以用和C#事件订阅逻辑几乎一致的AddHandler来绑定事件。比如在窗体的Load事件里(或者对象初始化的地方)添加:AddHandler btnSave.Click, AddressOf btnSave_Click这样就不需要变量带
WithEvents了,完全符合你之前用C#的思维方式。清理项目缓存解决VS2008的奇怪问题
有时候VS2008的项目缓存会导致一些莫明其妙的编译错误。你可以试试:- 点击菜单「项目」->「清理」当前项目;
- 关闭VS,删除项目目录下的
bin和obj文件夹; - 重新打开项目并编译。
额外提醒
如果是从SVN拉取的项目,有可能是之前的开发者手动修改了.Designer.vb文件,删掉了WithEvents关键字,或者项目文件本身有损坏。按照上面的步骤排查,基本能解决这个问题。
内容的提问来源于stack exchange,提问作者SamyCode
相关产品推荐
相关产品推荐

