Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Chriss Miller on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

CheckedChanged event for RadioButton 1

Status
Not open for further replies.

Andrzejek

Programmer
Jan 10, 2006
8,569
US

Why the CheckedChanged event fires twice for a group of Radio buttons?

Is it because it fires once when radio button goes from Checked to un-Checked and the second time when other radio button from that group goes from un-Checked to Checked state?

I have one CheckedChanged event handler for all my Radio buttons.
How can I go thru this event just once?
Code:
    Private Sub optCnsult_CheckedChanged(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles optCnsultAll.CheckedChanged, _
                optCnsultNew.CheckedChanged, optCnsultStatus.CheckedChanged

        Select Case True
            Case optCnsultAll.Checked

            Case optCnsultNew.Checked

            Case optCnsultStatus.Checked
                With cboStatusConsult
                    .ValueMember = "Column2"
                    .DisplayMember = "Column1"
                    .DataSource = tblConsultStatus
                    .SelectedIndex = 0
                    .Visible = True
                End With
        End Select
    End Sub

Have fun.

---- Andy
 
It fires multiple times because you have multiple controls wired to the same event handler. So if RB1 is checked and then you check RB2, RB1 has changed as has RB2. So the event fires twice.

You could try something like the following:
Code:
    Private Sub optCnsult_CheckedChanged(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles optCnsultAll.CheckedChanged, _
                optCnsultNew.CheckedChanged, optCnsultStatus.CheckedChanged

        Select Case True
            Case optCnsultAll.Checked

            Case optCnsultNew.Checked

            Case optCnsultStatus.Checked
            [COLOR=#ff0000][b]If sender Is optCnsultStatus Then[/b][/color]
                With cboStatusConsult
                    .ValueMember = "Column2"
                    .DisplayMember = "Column1"
                    .DataSource = tblConsultStatus
                    .SelectedIndex = 0
                    .Visible = True
                End With
            [COLOR=#ff0000][b]End If[/b][/color]
        End Select
    End Sub
 

I am kind of new to all this VB.NET stuff, but this is what I've changed to. It works:
Code:
Private Sub optCnsult_CheckedChanged(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles optCnsultAll.CheckedChanged, _
            optCnsultNew.CheckedChanged, optCnsultStatus.CheckedChanged

    Select Case [blue]CType(sender, RadioButton).Checked[/blue]
        Case [blue]optCnsultAll.Checked[/blue]

        Case [blue]optCnsultNew.Checked[/blue]

        Case [blue]optCnsultStatus.Checked[/blue]
            With cboStatusConsult
                .ValueMember = "Column2"
                .DisplayMember = "Column1"
                .DataSource = tblConsultStatus
                .SelectedIndex = 0
                .Visible = True
                .Focus()
            End With
    End Select
End Sub
I wouldn't be surprized if there was even better way of doing this.....

Have fun.

---- Andy
 
Looking at your code, this is what is happening. If optCnsultStatus is checked and you then check something else, your event fires first for optCnsultStatus. So, according to your Case logic, FALSE = FALSE and you are resetting your DataSource to what it already was.

You don't notice this because after that is complete, your event fires for the RadioButton you just checked, and I assume you are running other code that negates the previous operation.

That being said, I like your first logic, coupled with my adjustment. It may be easier to illustrate with a simple example. On a test form, drag 3 RadioButtons onto the form.

First, test this piece of code
Code:
    Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged
        Select Case True
            Case Me.RadioButton1.Checked
                If sender Is Me.RadioButton1 Then MessageBox.Show("RadioButton1 is checked")
            Case Me.RadioButton2.Checked
                If sender Is Me.RadioButton2 Then MessageBox.Show("RadioButton2 is checked")
            Case Me.RadioButton3.Checked
                If sender Is Me.RadioButton3 Then MessageBox.Show("RadioButton3 is checked")
        End Select

    End Sub
Each time you check a RadioButton, you get one MessageBox telling you what was checked.

Next, replace that code with this
Code:
    Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged
        Select Case CType(sender, RadioButton).Checked
            Case Me.RadioButton1.Checked
                MessageBox.Show("RadioButton1 is checked")
            Case Me.RadioButton2.Checked
                MessageBox.Show("RadioButton2 is checked")
            Case Me.RadioButton3.Checked
                MessageBox.Show("RadioButton3 is checked")
        End Select

    End Sub
You will notice you get two MessageBoxes instead of one each time you check a RadioButton (except for the very first time).
 

Thank RiverGuy, it makes sense.

Eventually I ended up with this:
Code:
Private Sub optCnsult_CheckedChanged(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles optCnsultAll.CheckedChanged, _
            optCnsultNew.CheckedChanged, optCnsultStatus.CheckedChanged
[blue]
    If CType(sender, RadioButton).Checked = False Then Exit Sub[/blue]

    Me.Cursor = Cursors.WaitCursor

    Select Case CType(sender, RadioButton).Checked
        Case optCnsultAll.Checked
            Call AccessToConsult()
        Case optCnsultNew.Checked
            Call AccessToConsult()
        Case optCnsultStatus.Checked
            With cboStatusConsult
                .ValueMember = "Column2"
                .DisplayMember = "Column1"
                .DataSource = tblConsultStatus
                .SelectedIndex = 0
                .Visible = True
                .Focus()
            End With
    End Select

    Me.Cursor = Cursors.Default
End Sub
So the first time I 'bail out' when change is to unchecked state.

Have fun.

---- Andy
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top