Radio button checked changed event fires twice

后端 未结 7 1001
梦谈多话
梦谈多话 2020-12-03 16:52

Please read my question its not a duplicate one.

I\'ve three radio buttons on windows form and all these buttons have common \'CheckedChanged\' event associated. Whe

相关标签:
7条回答
  • 2020-12-03 17:17

    CheckedChanged is raised whenever the Checked property changes. If you select a RadioButton then the previously selected RadioButton is unchecked (fired CheckedChanged), and then the new RadioButton is checked (fired CheckedChanged).

    0 讨论(0)
  • 2020-12-03 17:18
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }
            int click = 0;
            private void radioButton1_Click(object sender, EventArgs e)
            {
                click++;
                if (click %2==1)
                {
                    radioButton1.Checked = true;
                }
                if (click %2==0)
                {
                    radioButton1.Checked = false;
                }
                if (radioButton1.Checked==true)
                {
                    label1.Text = "Cheked";
                }
                if (radioButton1.Checked==false)
                {
                    label1.Text = "Uncheked";
                }
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-03 17:23

    To avoid it, just check if radioButton is checked

    for example:

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (radioButton1.Checked)
            //your code
    }
    
    0 讨论(0)
  • 2020-12-03 17:23

    It's triggering once for the radio button transition from checked to unchecked, and again for the radio button transitioning from unchecked to checked (i.e. any change in checked state triggers the event)

    0 讨论(0)
  • 2020-12-03 17:25

    The other answers are correct but miss the reason for the underlying problem. When a radio button is checked the first event sent is the change from the unchecked item however if you check its state by its control name you will still see its old checked status because the form has not been updated yet. To see its true status you need to cast the sender object. This allows you to perform any actions relating to the condition which is being deselected should you need to do so.

    In the not uncommon scenario below multiple radio buttons are sent to the same handler event. Simply checking the state of the sender for checked will not work here as we need to perform different actions depending on which radio button has been pressed. So first we ignore any sender that has just been unchecked. then we identify the checked sender by control name to process the correct action.

    private void ModeChangedExample(object sender, EventArgs e)
    {
        // multiple radio buttons come here
        // We only want to process the checked item.
        // if you need to something based on the item which was just unchecked don't use this technique. 
        // The state of the sender has not been updated yet in the form.
        // so checking against rdo_A check state will still show it as checked even if it has just been unchecked
        // only the sender variable is up to date at this point.
            
        // To prevent processing the item which has just been uncheked
        RadioButton RD = sender as RadioButton;
        if (RD.Checked == false) return;
    
        if (rdo_A.Name == RD.Name)
        {
            //Do stuff
        }
    
        if (rdo_B..Name == RD.Name)
        {
            // Do other stuff
        }
    
        if (rdo_C.Name == RD.Name)
        {
            // Do something else
        }
    
    }
    
    0 讨论(0)
  • 2020-12-03 17:27

    You could set the AutoCheck property true for each RadioButton then catch the Click event instead of the CheckChanged event. This would ensure that only one event is fired, and the logic in the handler can cast the sender to type RadioButton if needed to process the click. Often the cast can be avoided if the handler logic is simple. Here is an example which handles three controls, rbTextNumeric, rbTextFixed and rbTextFromFile:

            private void rbText_Click(object sender, EventArgs e)
        {
           flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked;
           txtBoxTextFixed.Enabled = rbTextFixed.Checked;
           flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked;
        }
    
    0 讨论(0)
提交回复
热议问题