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