VB.NET中如何通过字符串形式的名称获取对应Checkbox的选中值
解决方案
方法1:按控件名查找(直接匹配你原有的命名逻辑)
直接修正你的点击事件代码即可,不需要额外存全局变量或者写临时文件:
Sub addToOrderButtonClicked(ByVal sender As System.Object, ByVal e As System.EventArgs) ' 从点击的按钮名中提取商品ID Dim btn As Button = DirectCast(sender, Button) Dim productId As String = btn.Name.Substring(4) ' 从窗体控件集合中查找对应ID的两个复选框,第二个参数True代表递归查找所有子容器(如果复选框放在Panel等容器里也能找到) Dim cb1 As CheckBox = DirectCast(Me.Controls.Find("cb1_" & productId, True).FirstOrDefault(), CheckBox) Dim cb2 As CheckBox = DirectCast(Me.Controls.Find("cb2_" & productId, True).FirstOrDefault(), CheckBox) ' 取值使用 Dim cb1Checked As Boolean = If(cb1 IsNot Nothing, cb1.Checked, False) Dim cb2Checked As Boolean = If(cb2 IsNot Nothing, cb2.Checked, False) MsgBox($"你选中的按钮:{btn.Name},复选框1状态:{cb1Checked},复选框2状态:{cb2Checked}") End Sub
方法2:使用Tag属性关联控件(更优推荐)
不需要依赖控件命名,创建控件时直接把同组的复选框绑定到按钮的Tag属性,后续直接读取即可,性能更高也不容易出匹配错误:
- 先调整控件创建代码,把两个复选框存在按钮的Tag里:
' 先创建两个复选框 Dim checkBox1 As CheckBox = New CheckBox checkBox1.AutoSize = True checkBox1.Name = "cb1_" & array(0) ' 其余属性赋值省略 Me.Controls.Add(checkBox1) Dim checkBox2 As CheckBox = New CheckBox checkBox2.AutoSize = True checkBox2.Name = "cb2_" & array(0) ' 其余属性赋值省略 Me.Controls.Add(checkBox2) ' 创建按钮时把两个复选框存入Tag Dim button As Button = New Button button.Text = "Add to order" button.Name = "btn_" & array(0) ' 其余属性赋值省略 button.Tag = New CheckBox(){checkBox1, checkBox2} ' 关联同组复选框 Me.Controls.Add(button) AddHandler button.Click, AddressOf addToOrderButtonClicked
- 点击事件直接从Tag取即可:
Sub addToOrderButtonClicked(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim btn As Button = DirectCast(sender, Button) Dim cbs As CheckBox() = DirectCast(btn.Tag, CheckBox()) Dim cb1Checked As Boolean = cbs(0).Checked Dim cb2Checked As Boolean = cbs(1).Checked MsgBox($"你选中的按钮:{btn.Name},复选框1状态:{cb1Checked},复选框2状态:{cb2Checked}") End Sub
内容的提问来源于stack exchange,提问作者woah
相关产品推荐
相关产品推荐

