VB.NET转C#后ListControl点击事件无法向父窗体文本框传值如何解决
问题根因
- VB.NET默认开启后期绑定,允许对
Object类型的sender直接访问Name属性,运行时自动解析类型;C#是强类型语言,编译阶段就会检查类型成员,Object类没有Name属性,所以直接写sender.name会报编译错误。 - 原转换代码里的
ToString(sender.name)是错误写法,C#中ToString()是实例方法,不能这么调用,同时C#属性名大小写敏感,控件的名称属性是Name不是name。 - VB.NET中事件可以通过
Handles关键字自动绑定,C#需要手动订阅事件,转换时很容易漏掉这一步导致事件不触发。 - 你之前测试的代码里混用了VB.NET的
DirectCast语法,C#不支持该写法。
解决方案
第一步:修正ItemClicked方法代码
private void ItemClicked(object sender, EventArgs e) { // 模式匹配安全转换sender为Control类型 if (sender is Control clickedItem) { int itemIndex = flpListBox.Controls.IndexOfKey(clickedItem.Name); ItemClick?.Invoke(this, itemIndex); } }
第二步:检查两个必现配置项
- 检查
ListControl1.Add()方法的实现,确认添加列表项时,已经给每个列表项的Name属性显式赋值,IndexOfKey方法是匹配控件的Name属性来查找索引的,没有赋值会返回-1导致后续逻辑异常。 - 确认你已经手动订阅了
ItemClick事件,在Form1的构造函数或者Form1_Load方法中添加如下代码:
ListControl1.ItemClick += ListControl1_ItemClick;
按以上步骤修改后即可正常运行。
内容的提问来源于stack exchange,提问作者WiiLF
相关产品推荐
相关产品推荐

