John Obogne
John Obogne

Reputation: 1

How to uncheck other checkboxes by checking a checkbox?

When I press the chkCP1, it unchecks chkYP but chkCP doesn't display its checked state2; I need to double click chkCP before it displays its checked state3.

I used these codes:

Private Sub chkCP_CheckedChanged(sender As Object, e As EventArgs) Handles chkCP.CheckedChanged
    chkYP.Checked = False
End Sub

Private Sub chkYP_CheckedChanged(sender As Object, e As EventArgs) Handles chkYP.CheckedChanged
    chkCP.Checked = False
End Sub

Figure 1: 1

Figure 2: 2

Figure 3: 3

Upvotes: 0

Views: 105

Answers (3)

Bart Hofland
Bart Hofland

Reputation: 3905

You might have some issues with recursive event handlers here. If you set chkYP.Checked in chkCP_CheckedChanged, chkYP_CheckedChanged will be triggered. This sets chkCP.Checked, which triggers chkCP_CheckedChanged again.

You might try something like this:

Private _checking As Boolean

Private Sub chkCP_CheckedChanged(sender As Object, e As EventArgs) Handles chkCP.CheckedChanged
    If Not _checking Then
        _checking = True
        chkYP.Checked = False
        _checking = False
    End If
End Sub

Private Sub chkYP_CheckedChanged(sender As Object, e As EventArgs) Handles chkYP.CheckedChanged
    If Not _checking Then
        _checking = True
        chkCP.Checked = False
        _checking = False
    End If
End Sub

It may not win a beauty contest, but it might just do the job.

Using Radio Buttons might be a better solution if you want only one of N options selected.

Edit: Charles May's answer is way more elegant. He handles the Click event instead of the CheckedChanged event. And that also seems to work fine when using the keyboard (pressing the spacebar to toggle the checkbox).

Upvotes: 0

Charles May
Charles May

Reputation: 1763

I would personally use radiobuttons for this as this is what they were intended to do. However, I have seen a time where the option was to select neither option like you can easily do with checkboxes. That being said, You should be able to achieve the desired result by just simply moving your original code into the click event of the checkboxes instead of the checkchanged event. The reason is that when you click one, it triggers the checkchanged event which sets it to false which in turn triggers that controls checkchanged event. Try replacing your original code with

Private Sub chkCP_Click(sender As Object, e As EventArgs) Handles chkCP.Click
    chkYP.Checked = False
End Sub

Private Sub chkYP_Click(sender As Object, e As EventArgs) Handles chkYP.Click
    chkCP.Checked = False
End Sub

Upvotes: 1

John Obogne
John Obogne

Reputation: 1

edit: I tried using if statements and it worked! However, I cannot uncheck the checkbox anymore.

Private Sub chkCP_CheckedChanged(sender As Object, e As EventArgs) Handles chkCP.CheckedChanged
    If chkYP.Checked = True Then
        chkYP.Checked = False
    Else
        chkCP.Checked = True
    End If
End Sub

Private Sub chkYP_CheckedChanged(sender As Object, e As EventArgs) Handles chkYP.CheckedChanged
    If chkCP.Checked = True Then
        chkCP.Checked = False
    Else
        chkYP.Checked = True
    End If
End Sub

Upvotes: 0

Related Questions