Отметить несколько флажков
У меня 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