VB.NET验证复选框

VB.NET验证复选框,vb.net,checkbox,Vb.net,Checkbox,如果选中多个复选框,我如何选中单个复选框,即我有51个复选框,如果选中了50个复选框,则将选中剩余的单个复选框。我该怎么做 这是我的代码: For Each chk In Me.Controls If TypeOf chk Is CheckBox Then If CType(chk, CheckBox).Checked = True Then chkAll.Checked = True End If End If N

如果选中多个复选框,我如何选中单个复选框,即我有51个复选框,如果选中了50个复选框,则将选中剩余的单个复选框。我该怎么做

这是我的代码:

For Each chk In Me.Controls
    If TypeOf chk Is CheckBox Then
        If CType(chk, CheckBox).Checked = True Then
                chkAll.Checked = True
        End If
    End If
Next

如果这是正确的,那么我的问题是我不知道把它放在哪里。因为它不应该在
按钮中

将其设置为所有复选框的处理程序:

Private Sub CheckBox_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, CheckBox3.CheckedChanged ' And so on...
    Dim allChecked As Boolean = True

    For Each chk In Me.Controls
        If TypeOf chk Is CheckBox Then
            If chk.Equals(chkAll) Then
                Continue For
            End If

            If CType(chk, CheckBox).Checked = False Then
                allChecked = False

                Exit For
            End If
        End If
    Next

    chkAll.Checked = allChecked
End Sub

创建选中所有复选框的函数

Public Function IsAllCheckBoxesChecked() As Boolean
    Dim isAllChecked As Boolean = True
    For Each chk As CheckBox In Me.Controls.Cast(Of CheckBox)
        If checkbox.Equals(Me.chkAll) = True Then Continue For
        If checkBox.Checked = false Then
            isAllChecked = false
            Exit For
        End If
    Next
    Return isAllChecked
End Function
或LINQ方法

Public Function IsAllCheckBoxesChecked() As Boolean
    Return Me.Controls.
              Cast(Of CheckBox).
              All(Function(chk) chk.Equals(Me.chkAll) = False AndAlso chk.Checked = True)
End Function
然后为所有复选框创建CheckedChange eventhandler并在那里使用这些函数

Private Sub CheckBoxes_CheckedChange(sender As Object, e As EventArgs)
    Dim chk As CheckBox = DirectCast(sender, CheckBox)
    If chk.Checked = True Then
        ' Check if all CheckBoxes are checked
        Me.chkAll.Checked = IsAllCheckBoxesChecked()
    Else
        ' No need to loop other chekboxes, anyway it is false
        Me.chkAll.Checked = False
    End If
End Sub

首先,为所有复选框准备
CheckedChanged
事件处理程序:

Private Sub CheckBox_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, CheckBox3.CheckedChanged, CheckBox4.CheckedChanged 'etc..
    .
    .
    .
End Sub
然后在事件处理程序中,使用LINQ
Where
Select
以最佳解决问题:

Dim allCheckBoxes = Me.Controls.Cast(Of Control)().Where(Function(x) TypeOf x Is CheckBox).Select(Function(y) CType(y, CheckBox))
Dim thisCb = CType(sender, CheckBox)
If allCheckBoxes.Where(Function(x) x.Checked).ToList().Count >= 50 And thisCb.Checked Then 'if atleast 50 checkboxes are checked and the current one is checked
    Dim nonCheckedCheckBoxes = allCheckBoxes.Where(Function(t) Not t.Checked).ToList()
    nonCheckedCheckBoxes.ForEach(Function(t) t.Checked = True)
End If
上面的LINQ基本上是惰性地获取所有的
复选框

Dim allCheckBoxes = Me.Controls.Cast(Of Control)().Where(Function(x) TypeOf x Is CheckBox).Select(Function(y) CType(y, CheckBox))
然后,检查选中的
复选框的数量是否等于50,并检查发件人的(
复选框
)。如果未选中发件人,则我们将忽略它,因为用户可能有意取消选中它(更正计入):

如果是,则选中其余未选中的
复选框

Dim nonCheckedCheckBoxes = allCheckBoxes.Where(Function(t) Not t.Checked).ToList()
nonCheckedCheckBoxes.ForEach(Function(t) t.Checked = True)

我应该把这个放在哪里?在
chkAll\u CheckedChanged
?它不工作,我无法取消选中
chkAll
复选框控件。我不知道这是可能的!谢谢如果
chkAll
控件在then
Me.Controls
集合中(我假设是),那么这个解决方案将不起作用,因为
chkAll.Checked
总是错误的。您可以检查
chk
是否为
chkAll
然后忽略它。如果您有LINQ解决方案,它可以吗?可以,这是为那些知道如何使用LINQ的人准备的,因为我不知道=)好的,发布了一个LINQ版本的答案。:)使用这种方法,如果选中了所有复选框(51),则用户将无法取消选中任何其他复选框。当用户取消选中某些复选框时,您的代码将计算此时选中的集合包含50个复选框,并将自动将刚才未选中的复选框重新选中
Dim nonCheckedCheckBoxes = allCheckBoxes.Where(Function(t) Not t.Checked).ToList()
nonCheckedCheckBoxes.ForEach(Function(t) t.Checked = True)