用户控件内置TextBox的TextChanged事件C#代码转VB.NET报错求解
报错原因
你遇到的报错是VB.NET和C#的事件语法差异导致的:C#允许直接访问事件字段做非空判断再调用Invoke触发,而VB.NET中禁止直接对事件名做空值判断,也没有事件名.Invoke的用法。同时你转换的代码还缺失了用户控件必需的继承声明。
正确的VB.NET实现代码
' 显式导入特性所在的命名空间 Imports System.ComponentModel <DefaultEvent("_TextChanged")> Public Class UserControl3 ' 必须显式声明继承UserControl Inherits UserControl ' 声明自定义暴露的TextChanged事件 Public Event _TextChanged As EventHandler Private Sub textBox1_TextChanged(sender As Object, e As EventArgs) Handles textBox1.TextChanged ' VB用RaiseEvent触发事件,内部自动判断是否有订阅者,无需手动判空,不会抛出空引用异常 RaiseEvent _TextChanged(sender, e) End Sub End Class
补充说明
如果确实有需要先判断事件是否存在订阅者的场景,可以访问VB为事件自动生成的后台字段,命名规则为事件名+Event后缀:
If _TextChangedEvent IsNot Nothing Then RaiseEvent _TextChanged(sender, e) End If
这个写法和你C#代码中的空值判断逻辑完全等价,常规场景下直接用RaiseEvent即可,不需要额外判空。
内容的提问来源于stack exchange,提问作者Jose Andres Martinez Perez
相关产品推荐
相关产品推荐

