Отметить несколько флажков

У меня 2 ряда checkboxes по имени.

как это:

верхний (ск18, ск17, ск16, ск15, ск14, ск13, ск12, ск11, ск21, ск22, ск23, ск24, ск25, ск26, ск27, ск28)

ниже (ск38, ск37, ск36, ск35, ск34, ск33, ск32, ск31, ск41, ск42, ск43, ск44, ск45, ск46, ск47, ск48)

Сортировка в следующем порядке:

Есть простой способ проверить диапазон флажков при нажатой клавише Shift? (как выделение текста в слове) = просто отметьте первый, а затем последний, пока нажата клавиша shift, чтобы автоматически отметить промежуточные флажки.

2 ответа

Решение

Учитывая, что вы говорите о Windows Forms, вы можете использовать этот код:

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

Я предполагаю, что флажки располагаются в форме в том же порядке, который вы указали здесь, поэтому я использовал этот порядок для заполнения списка. Если это неправильный визуальный порядок, вы должны исправить порядок, в котором они добавляются в список.

Как насчет кнопки с надписью Check All Boxes, а затем вызывать эту Sub из нажатия кнопки.

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
Другие вопросы по тегам