当两个选中时禁用GroupBox中的其他复选框

问题描述:

Private Sub AllBoxes_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, CheckBox3.CheckedChanged, CheckBox4.CheckedChanged, CheckBox5.CheckedChanged, CheckBox6.CheckedChanged 

    Dim qty As Int16 = 0 
    Dim cb As CheckBox 


    For Each cb In GroupBox8.Controls.OfType(Of CheckBox) 
     If cb.Checked Then 
      qty += 1 
     End If 
    Next 

    If qty = 2 Then 

     For Each cb In GroupBox8.Controls.OfType(Of CheckBox) 
      If Not cb.Checked Then 
       cb.Enabled = False 
      End If 
     Next 
    Else 

     For Each cb In GroupBox8.Controls.OfType(Of CheckBox) 
      cb.Enabled = True 
     Next 
    End If 
End Sub 

它只是不起作用。 groupbox的名字是groupbox8,它有6个复选框。我需要选择两个复选框。当两个选中时禁用GroupBox中的其他复选框

您可以使用LINQ的一点的

Private Sub AllBoxes_CheckedChanged(sender As Object, e As EventArgs) 

    ' Get all checkboxes in the groupBox8 
    Dim checks = groupBox8.Controls.OfType(Of CheckBox)() 
    ' Count how many are checked 
    Dim cnt = checks.Where(Function(x) x.Checked).Count() 

    If cnt < 2 Then 
     ' Enable all, avoid an if and don't care if already enabled 
     For Each c In checks 
      c.Enabled = True 
     Next 
    Else 
     ' Disable all except the two checked... 
     For Each k In checks.Where(Function(x) Not x.Checked) 
      k.Enabled = False 
     Next 
    End If 
End Sub 
+0

:)很好的解决方案简化了很多你的CheckedChanged事件处理程序...简化可能不是正确的字虽然... –

+0

好,LINQ的是在第一次恐吓,但是一旦你掌握了通过一个产生另一个序列的表达式枚举的序列的概念,所有的部分开始落在原地。 – Steve

+0

雅但它既不快也不容易阅读,并最终添加更多的对象代码比经典的方法..只是我的意见,虽然, –