取消选中 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
我添加了一个包含一些名称和 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