VB.NET验证复选框
如果选中多个复选框,我如何选中单个复选框,即我有51个复选框,如果选中了50个复选框,则将选中剩余的单个复选框。我该怎么做 这是我的代码: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
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
然后在事件处理程序中,使用LINQWhere
和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
控件在thenMe.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)