【问题标题】:Uncheck an item and "Select All" option from CheckedListBox on Windows Form从 Windows 窗体上的 CheckedListBox 中取消选中一个项目和“全选”选项
【发布时间】:2018-01-08 10:09:53
【问题描述】:

我添加了一个带有一些名称的复选框列表和一个全选选项。当我选择(全选)选项时,我可以选中复选框列表中的所有复选框。

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

以下是为(全选)功能附加的 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窗体上复选框列表的图片,供大家参考。

.

【问题讨论】:

  • "每当我取消选中复选框列表中的任何选项时,我都无法取消选中 Select All" 显示您尝试取消选中第一项的代码.
  • 所以如果你取消选中任何其他选项,你不能取消选中全选?
  • 例如:- 如果我取消选中 B1,它应该取消选中(全选)和(B1)。因为当我取消选择 B1 时,(全选)将不适用。
  • 我如何在这个中使用过滤器??

标签: vb.net winforms checkedlistbox


【解决方案1】:

一般来说,我会使用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 块似乎正是您想要的。

【讨论】:

  • 感谢@Tim Schmelter,这对我有用。我错过了其他部分。
【解决方案2】:

尝试为第一个 'If' 条件添加 Else,并添加第二个 'If' 语句以检查“全选”复选框是否未选中。

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

【讨论】:

    【解决方案3】:

    如下所示,您应该获得所需的功能:

    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
    

    【讨论】:

      猜你喜欢
      • 2016-11-06
      • 1970-01-01
      • 2016-10-27
      • 2021-11-23
      • 2014-09-12
      • 2018-02-06
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多