取消选中 Windows 表单上 CheckedListBox 中的项目和 "Select All" 选项

Uncheck an item and "Select All" option from CheckedListBox on Windows Form

我添加了一个包含一些名称和 select 全部选项的复选框列表。当我 select(Select 全部)选项时,我能够 select 复选框列表中的所有复选框。

这里的问题是,每当我取消选中复选框列表中的任何选项时,我都无法取消选中(Select 全部)选项。

下面是为(Select 所有)功能附加的 vb.net 代码。

Private Sub ChkLB_dl_name_cb_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles ChkLB_dl_name_cb.ItemCheck        
    If e.Index = 0 Then
        Dim newCheckedState As Integer = e.NewValue
        For i As Integer = 1 to ChkLB_dl_name_cb.Items.Count - 1
            Me.ChkLB_dl_name_cb.SetItemCheckState(i, newCheckedState)
        Next
    End If 
End Sub

下面是 windows 表单上复选框列表的图片,供您参考。

.

通常我会使用 Boolean 变量来避免为您以编程方式更改的每个项目调用此处理程序。这也将解决您无法取消选中第一项的问题:

Private updatingListProgramatically As Boolean = False

Private Sub ChkLB_dl_name_cb_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles ChkLB_dl_name_cb.ItemCheck
    If updatingListProgramatically Then Return

    If e.Index = 0 Then
        updatingListProgramatically = True
        For i As Integer = 1 To ChkLB_dl_name_cb.Items.Count - 1
            Me.ChkLB_dl_name_cb.SetItemCheckState(i, e.NewValue)
        Next
    Else
        Dim checked As Boolean = e.NewValue = CheckState.Checked
        If Not checked Then
            updatingListProgramatically = True
            Me.ChkLB_dl_name_cb.SetItemCheckState(0, CheckState.Unchecked)
        End If
    End If

    updatingListProgramatically = False
End Sub

Else 块似乎是您所要求的。

尝试为第一个 'If' 条件添加一个 Else 并添加第二个 'If' 语句来检查 "Select All" 复选框是否未选中。

Private Sub ChkLB_dl_name_cb_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles ChkLB_dl_name_cb.ItemCheck       
    If e.Index = 0 Then
        If ChkLB_dl_name_cb.GetItemCheckState(0) = CheckState.Unchecked Then
            Dim newCheckedState As Integer = e.NewValue
            For i As Integer = 1 To ChkLB_dl_name_cb.Items.Count - 1
                ChkLB_dl_name_cb.SetItemCheckState(i, newCheckedState)
            Next
        End If
    Else
        ChkLB_dl_name_cb.SetItemCheckState(0, CheckState.Unchecked)
    End If
End Sub

像下面一样你应该得到想要的功能:

Private Sub ChkLB_dl_name_cb_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles ChkLB_dl_name_cb.ItemCheck
    If e.Index = 0 Then
        Dim newCheckedState As Integer = e.NewValue
        For i As Integer = 1 To ChkLB_dl_name_cb.Items.Count - 1
            Me.ChkLB_dl_name_cb.SetItemCheckState(i, newCheckedState)
        Next
    Else
        'Remove the event-handler to prevent the ItemCheck-method from being called again
        RemoveHandler ChkLB_dl_name_cb.ItemCheck, AddressOf ChkLB_dl_name_cb_ItemCheck

        'If the item is being checked and all items are checked
        '(except "Select All"), then check "Select All"
        If e.NewValue = CheckState.Checked AndAlso
           ChkLB_dl_name_cb.CheckedItems.Count + 1 = ChkLB_dl_name_cb.Items.Count - 1 Then
            'Check "Select All"
            ChkLB_dl_name_cb.SetItemCheckState(0, CheckState.Checked)
        Else
            'Uncheck "Select All"
            ChkLB_dl_name_cb.SetItemCheckState(0, CheckState.Unchecked)
        End If

        'Re-Add the handler
        AddHandler ChkLB_dl_name_cb.ItemCheck, AddressOf ChkLB_dl_name_cb_ItemCheck
    End If
End Sub