【问题标题】:Disable other checkboxes in a GroupBox when two are checked选中两个时禁用 GroupBox 中的其他复选框
【发布时间】:2017-02-25 18:59:21
【问题描述】:
 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 个复选框。我需要选中两个复选框。

【问题讨论】:

    标签: vb.net checkbox


    【解决方案1】:

    您可以使用一些 Linq 来简化很多 CheckedChanged 事件处理程序

    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
    

    【讨论】:

    • 嗯,Linq 一开始很吓人,但是一旦你掌握了通过一个产生另一个序列的表达式来枚举序列的概念,所有的部分都会开始到位。
    • 是的,但它既不快速也不易于阅读,并且最终添加了比经典方法更多的目标代码.. 只是我的看法,
    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2015-06-28
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多