VB.NET(VS2019)快速点击CheckedListBox致全选CheckBox响应异常问题
问题分析与解决
问题原因
你绑定的CheckedListBox1_SelectedValueChanged事件是选中项变化时触发,而非勾选状态变化时触发。快速点击列表项时,选中项的切换会先触发该事件,但此时列表项的勾选状态尚未完成更新,导致CheckedItems.Count的取值并非当前真实的勾选数量,最终造成全选CheckBox的状态显示异常。
正确处理方式
应该改用ItemCheck事件来监听勾选状态的变化,这个事件会在列表项的勾选状态即将改变时触发,并且能获取到新的勾选状态。需要注意的是,在ItemCheck事件中CheckedItems.Count还未更新,所以要手动计算真实的勾选数量:
修正后的核心代码
Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load CheckedListBox1.Items.Clear() For a = 0 To 8 CheckedListBox1.Items.Add("a" & a) Next End Sub Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck ' 计算当前真实的勾选数量:现有数量 + 状态变化的增量 Dim currentCheckedCount As Integer = CheckedListBox1.CheckedItems.Count Select Case e.NewValue Case CheckState.Checked currentCheckedCount += 1 Case CheckState.Unchecked currentCheckedCount -= 1 ' 中间状态不影响勾选数量,无需调整 End Select Dim chkState As CheckState If currentCheckedCount = 0 Then chkState = CheckState.Unchecked ElseIf currentCheckedCount = CheckedListBox1.Items.Count Then chkState = CheckState.Checked Else chkState = CheckState.Indeterminate End If CheckBox1.CheckState = chkState End Sub
全选CheckBox的联动补充
如果需要实现点击全选CheckBox来批量控制列表项的勾选状态,可添加以下代码避免事件循环:
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged ' 临时取消ItemCheck事件绑定,防止循环触发 RemoveHandler CheckedListBox1.ItemCheck, AddressOf CheckedListBox1_ItemCheck For i As Integer = 0 To CheckedListBox1.Items.Count - 1 CheckedListBox1.SetItemChecked(i, CheckBox1.Checked) Next ' 重新绑定事件 AddHandler CheckedListBox1.ItemCheck, AddressOf CheckedListBox1_ItemCheck End Sub
内容的提问来源于stack exchange,提问作者Mansour Dalir
相关产品推荐
相关产品推荐

