VB.NET中如何引用动态创建窗体sender内的combobox_projecttype控件?
问题描述
我尝试引用动态创建的sender用户窗体中的combobox_projecttype控件,该窗体通过代码动态创建并添加了事件处理。创建窗体的代码如下:
'Declare variables Dim NewForm_SmartHUB_Projects As New Form_SmartHUB_Projects With NewForm_SmartHUB_Projects .Name = "Form_SmartHUB_" & sender.text & "_" & iNewForm_SmartHUB_Projects .Text = sender.text AddHandler NewForm_SmartHUB_Projects.Activated, AddressOf DynamicForm_NewForm_SmartHUB_ProjectsActivated iNewForm_SmartHUB_Projects +=1 End With
对应的事件处理子程序:
Sub DynamicForm_NewForm_SmartHUB_ProjectsActivated(ByVal sender As Object, ByVal e As EventArgs) Debug.Print(sender.Name) strProjectTypeFolderName = sender.combobox_projecttype.selecteditem End Sub
Debug.Print可以正确返回sender窗体的名称,但sender对象无法识别combobox_projecttype控件。iNewForm_SmartHUB_Projects是Long类型变量,每次自增以保证窗体名称唯一。请问问题出在哪,该如何引用动态创建窗体sender中的控件?
解决方案
问题核心是事件参数sender的类型为Object,VB编译阶段无法识别它是你的自定义窗体类Form_SmartHUB_Projects的实例,因此无法直接访问该类的成员控件。只需将sender转换为自定义窗体类型即可解决。
修改后的事件处理代码:
Sub DynamicForm_NewForm_SmartHUB_ProjectsActivated(ByVal sender As Object, ByVal e As EventArgs) Debug.Print(sender.Name) ' 将Object类型的sender转换为自定义窗体类型 Dim targetForm As Form_SmartHUB_Projects = DirectCast(sender, Form_SmartHUB_Projects) ' 正常访问控件 strProjectTypeFolderName = targetForm.combobox_projecttype.SelectedItem End Sub
额外说明
DirectCast是类型转换的安全方式,前提是sender确实是Form_SmartHUB_Projects实例(这里符合,因为事件绑定的就是该类的Activated事件)。- 如果需要更严谨的类型判断,可添加类型检查:
Sub DynamicForm_NewForm_SmartHUB_ProjectsActivated(ByVal sender As Object, ByVal e As EventArgs) Debug.Print(sender.Name) If TypeOf sender Is Form_SmartHUB_Projects Then Dim targetForm As Form_SmartHUB_Projects = DirectCast(sender, Form_SmartHUB_Projects) strProjectTypeFolderName = targetForm.combobox_projecttype.SelectedItem End If End Sub
内容的提问来源于stack exchange,提问作者Eduards
相关产品推荐
相关产品推荐

