如何设置CheckListBox选中项?SetItemChecked方法失效求解决方案
解决CheckListBox.SetItemChecked无法正常工作的问题
嘿,我一眼就看到你代码里的关键问题了——VB.NET里的范围判断写法不对!你写的0 <= value < 20这种表达式,在VB里并不是你预期的“判断value在0到20之间”的逻辑。它会先计算0 <= value得到一个布尔值(True对应-1,False对应0),然后把这个数值和20比较,结果就是所有条件都不会正确触发,自然SetItemChecked就没反应了。
给你修正后的代码,同时我还加了“先取消所有已勾选项”的逻辑(如果你需要每次只选中对应区间的项的话):
Private Sub Check(value As Double) ' 先清空所有已勾选的项,避免多个项同时被选中 For i As Integer = 0 To Me.CheckedListBox1.Items.Count - 1 Me.CheckedListBox1.SetItemChecked(i, False) Next ' 修正范围判断的正确写法:用AndAlso连接两个条件 If value >= 0 AndAlso value < 20 Then Me.CheckedListBox1.SetItemChecked(0, True) ElseIf value >= 20 AndAlso value < 40 Then Me.CheckedListBox1.SetItemChecked(1, True) ElseIf value >= 40 AndAlso value < 60 Then Me.CheckedListBox1.SetItemChecked(2, True) ElseIf value >= 60 AndAlso value < 80 Then Me.CheckedListBox1.SetItemChecked(3, True) Else ' 处理value >=80或者小于0的情况,这里假设你有第5个项(索引4) If Me.CheckedListBox1.Items.Count > 4 Then Me.CheckedListBox1.SetItemChecked(4, True) End If End If End Sub
另外还要检查两个点:
- 确保你的
CheckedListBox1里有足够的项,比如你用到了索引0到4,那Items集合至少要有5个元素,不然会抛出索引越界的错误 - 如果这个
Check方法是在非UI线程调用的(比如后台线程),必须用Invoke回到UI线程操作控件,不然控件也不会响应:
Private Sub Check(value As Double) ' 判断是否需要跨线程调用 If Me.CheckedListBox1.InvokeRequired Then Me.CheckedListBox1.Invoke(Sub() Check(value)) Return End If ' 把上面的逻辑代码放在这里 End Sub
内容的提问来源于stack exchange,提问作者An Nguyễn
相关产品推荐
相关产品推荐

