VB.NET循环批量设置控件Enabled属性不生效,单独写事件正常求助
循环代码失效的核心原因
- 触发时机错误:你编写的循环代码仅在被调用的那一刻执行一次,如果你只把这段循环放在窗体初始化逻辑中,后续用户手动修改ComboBox选中项时不会再次触发判断,自然不会生效。而单独编写的
SelectedIndexChanged事件会在每次对应ComboBox选中项变化时自动执行,所以功能正常。 - 控件名大小写不匹配:你循环中查找Label时使用的控件名是
lblSumname(name的n小写),但实际你代码里的控件名是lblSumName(Name的N大写),WinForm的Controls集合查找控件时区分大小写,会导致查找失败返回Nothing,对应逻辑无法执行。
修正方案
不需要写5份重复的事件处理代码,编写一个通用的事件处理方法,绑定到所有ComboBox的SelectedIndexChanged事件即可:
Private Sub cbmQty_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbmQty1.SelectedIndexChanged, cbmQty2.SelectedIndexChanged, cbmQty3.SelectedIndexChanged, cbmQty4.SelectedIndexChanged, cbmQty5.SelectedIndexChanged ' 获取触发本次事件的ComboBox控件 Dim currentCbm As ComboBox = CType(sender, ComboBox) ' 提取控件后缀的序号 Dim index As Integer = Integer.Parse(currentCbm.Name.Replace("cbmQty", "")) If currentCbm.SelectedIndex = 0 Then ' 查找对应序号的关联控件,注意控件名和实际命名保持一致 CType(Me.Controls("lblSumName" & index), Label).Enabled = False CType(Me.Controls("btnSum" & index), Button).Enabled = False CType(Me.Controls("lblSumPrice" & index), Label).Enabled = False CType(Me.Controls("lblPriceTit" & index), Label).Enabled = False CType(Me.Controls("lblQtyTit" & index), Label).Enabled = False CType(Me.Controls("chkName" & index), CheckBox).Checked = False currentCbm.Enabled = False End If End Sub
补充说明
如果你的控件是放在Panel、GroupBox等容器控件内,不能直接用Me.Controls查找,需要改为对应容器的Controls属性,比如CType(GroupBox1.Controls("lblSumName" & index), Label)。
如果需要在窗体加载时就初始化所有符合条件的控件状态,把你原来的循环修正控件名大小写后放在Form_Load事件中执行即可。
内容的提问来源于stack exchange,提问作者Duc Nguyen
相关产品推荐
相关产品推荐

