Mark multiple checkboxes

93 Views Asked by At

I've 2 rows of checkboxes named.

like this:

upper (ck18,ck17,ck16,ck15,ck14,ck13,ck12,ck11,ck21,ck22,ck23,ck24,ck25,ck26,ck27,ck28)

lower (ck38,ck37,ck36,ck35,ck34,ck33,ck32,ck31,ck41,ck42,ck43,ck44,ck45,ck46,ck47,ck48)

Sorted in this order:

There is an easy way to check a range of checkboxes while shift key is pressed ? (like text selection at word) = just mark the first and then the last while shift is pressed to mark automatically the intermediate checkboxes.

2

There are 2 best solutions below

0
On BEST ANSWER

Considering you are talking about Windows Forms, you can use this code:

Public Class Form1

   Private _upperChkList As List(Of CheckBox)
   Private _lowerChkList As List(Of CheckBox)
   Private _firstChkClickedIndex As Integer = -1
   Private _firstChkClickedState As CheckState = CheckState.Indeterminate

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

      ' Stores all the upper CheckBoxes in their specific list.
      _upperChkList = New List(Of CheckBox) From
         {ck18, ck17, ck16, ck15, ck14, ck13, ck12, ck11,
         ck21, ck22, ck23, ck24, ck25, ck26, ck27, ck2}
      ' Stores all the lower CheckBoxes in their specific list.
      _lowerChkList = New List(Of CheckBox) From
         {ck38, ck37, ck36, ck35, ck34, ck33, ck32, ck31,
         ck41, ck42, ck43, ck44, ck45, ck46, ck47, ck48}

      ' Defines the Click event handler for all the CheckBoxes.
      For Each chk In _upperChkList
         AddHandler chk.Click, AddressOf UpperCheckBoxes_Click
      Next
      For Each chk In _lowerChkList
         AddHandler chk.Click, AddressOf LowerCheckBoxes_Click
      Next

   End Sub

   Private Sub UpperCheckBoxes_Click(sender As Object, e As EventArgs)

      ' Redirects to the procedure that manages the CheckBoxes selection, passing
      ' the desired list to be handled, the upper CheckBoxes list, in this case.
      OnCheckBoxesClick(sender, _upperChkList)

   End Sub

   Private Sub LowerCheckBoxes_Click(sender As Object, e As EventArgs)

      ' Redirects to the procedure that manages the CheckBoxes selection, passing
      ' the desired list to be handled, the lower CheckBoxes list, in this case.
      OnCheckBoxesClick(sender, _lowerChkList)

   End Sub

   Private Sub OnCheckBoxesClick(sender As Object, chkList As List(Of CheckBox))

      ' Converts the sender from Object to Checkbox.
      Dim chk = CType(sender, CheckBox)

      ' If Shift key is not pressed, stores the index of the 
      ' first CheckBox pressed, And its state.
      If Control.ModifierKeys <> Keys.Shift Then
         ' Searches the CheckBox being clicked in the list and returns its index.
         ' Since Shift key is not pressed, that will be the first CheckBox.
         _firstChkClickedIndex = chkList.FindIndex(Function(c) c.Equals(chk))
         _firstChkClickedState = chk.CheckState
         Return
      End If

      ' If it got here, Shift key is pressed, so, it must have
      ' a first CheckBox stored. If not, don't go on.
      If _firstChkClickedIndex < 0 Then
         Return
      End If
      ' If the state of the actual CheckBox is different than the 
      ' state of the first one, don't go on.
      If chk.CheckState <> _firstChkClickedState Then
         Return
      End If

      ' Searches the CheckBox being clicked in the list and returns its index.
      ' Since Shift key is pressed, that will be the last CheckBox.
      Dim lastChkClickedIndex = chkList.FindIndex(Function(c) c.Equals(chk))

      ' Checks if we are going from a lower to a higher index, or the contrary.
      Dim stepDirection As Integer = If(lastChkClickedIndex >= _firstChkClickedIndex, 1, -1)
      ' Iterates the list from the first to the last CheckBoxes clicked 
      ' and changes the state of all the CheckBoxes in between to match 
      ' the state of the first CheckBox clicked.
      For i = _firstChkClickedIndex To lastChkClickedIndex Step stepDirection
         chkList(i).CheckState = _firstChkClickedState
      Next

      ' Resets the first CheckBox variables.
      _firstChkClickedIndex = -1
      _firstChkClickedState = CheckState.Indeterminate

   End Sub

End Class

I'm guessing the CheckBoxes are disposed at the form in the same order you've put here, so, that's the order I've used to populate the list. If that's not the correct visual order, you have to fix the order in which they are added to the list.

0
On

How about a button that says Check All Boxes and then call this Sub from the Button Click.

Private Sub CheckThemAll()
        For Each ctr As Control In Controls
            If TypeOf ctr Is CheckBox Then
                CType(ctr, CheckBox).Checked = True
            End If
        Next
End Sub