vb.netcheckboxkeypressshiftkeypreview

Mark multiple checkboxes


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.


Solution

  • 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.