#vb.net
#vb.net
Вопрос:
Я создал 6 флажков в Vb, и я хочу закодировать, что если любые три из них будут отмечены, то определенное значение будет показано в отдельной метке.
Ответ №1:
Я бы создал массив ваших флажков и подключил их к общему обработчику CheckChanged(). Затем вы можете использовать простой запрос LINQ, чтобы подсчитать количество из них, которые отмечены.
Что-то вроде:
Public Class Form1
Private CheckBoxes() As CheckBox
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
' change the below to the names of your six checkboxes:
CheckBoxes = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6}
For Each cb In CheckBoxes
AddHandler cb.CheckedChanged, AddressOf CheckBoxes_CheckedChanged
Next
Label1.Text = "Select at least three checkboxes."
End Sub
Private Sub CheckBoxes_CheckedChanged(sender As Object, e As EventArgs)
If CheckBoxes.Where(Function(cb) cb.Checked).Count >= 3 Then
Label1.Text = "Thank you!"
Else
Label1.Text = "Select at least three checkboxes."
End If
End Sub
End Class
Комментарии:
1. Нет необходимости в цикле и
AddHandler
. Вы можете выбрать всеCheckBoxes
в конструкторе, открыть окно Свойств , нажать кнопку События , а затем дважды щелкнутьCheckedChanged
событие, чтобы сгенерировать обработчик события со всеми элементами управления вHandles
предложении. Затем вы можете создать списокCheckBoxes
в обработчике событий либо явно, либо, если они все находятся в одном контейнере и они единственныеCheckBoxes
в этом контейнере, с помощью LINQ:Dim checkBoxes = Controls.OfType(Of CheckBox)()
.2. Также нет необходимости вызывать
Where
иCount
asCount
принимает те же предикаты, которыеWhere
выполняют:If CheckBoxes.Count(Function(cb) cb.Checked) >= 3 Then
.3. Спасибо @jmcilhinney, я просто всегда вводил его таким образом с помощью Where (), потому что для меня это «выглядит правильно». От старых привычек трудно избавиться. Что касается других предложений, определенно существует более одного способа освежевать кошку…