首先,为所有复选框准备 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所做的基本上就是懒惰地获取所有CheckBoxes:
Dim allCheckBoxes = Me.Controls.Cast(Of Control)().Where(Function(x) TypeOf x Is CheckBox).Select(Function(y) CType(y, CheckBox))
然后,检查已检查的CheckBoxes 的数量是否等于50,并检查发件人的(CheckBox)。如果未选中发件人,则我们将其省略,因为用户可能有意取消选中它(更正归功于Fabio):
If allCheckBoxes.Where(Function(x) x.Checked).ToList().Count = 50 And thisCb.Checked Then 'if 50 checkboxes are checked
如果是,那么你检查剩余的未检查CheckBoxes:
Dim nonCheckedCheckBoxes = allCheckBoxes.Where(Function(t) Not t.Checked).ToList()
nonCheckedCheckBoxes.ForEach(Function(t) t.Checked = True)