单选按钮检查已更改的事件触发两次

时间:2012-07-15 16:59:11

标签: c# winforms radio-button oncheckedchanged

请阅读我的问题,这不是一个重复的问题。

我在Windows窗体上有三个单选按钮,所有这些按钮都有相关的常见'CheckedChanged'事件。当我点击任何这些单选按钮时,它会两次触发'CheckedChanged'事件。

这是我的代码:

private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
    //My Code
}

我插入断点,此事件中的整个代码迭代两次。 请告诉我它为什么会这样?

7 个答案:

答案 0 :(得分:59)

正如其他回答者正确地说的那样,事件被触发两次,因为每当一个组中的一个RadioButton被检查时,另一个将被取消选中 - 因此被检查的已更改事件将被触发两次。

要仅针对刚刚选择的RadioButton在此事件中执行任何工作,您可以查看发件人对象,执行以下操作:

void radioButtons_CheckedChanged(object sender, EventArgs e)
{
    RadioButton rb = sender as RadioButton;
    if (rb != null)
    {
        if (rb.Checked)
        {
            // Only one radio button will be checked
            Console.WriteLine("Changed: " + rb.Name);
        }
    }
}

答案 1 :(得分:5)

为避免这种情况,只需检查是否已选中radioButton

例如:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton1.Checked == true)
        //your code
}

答案 2 :(得分:4)

只要Checked属性发生更改,就会引发CheckedChanged。如果选择RadioButton,则取消选中先前选择的RadioButton(触发CheckedChanged),然后检查新的RadioButton(触发CheckedChanged)。

答案 3 :(得分:2)

它会触发一次单选按钮从选中状态转换为未选中状态,再次触发单选按钮从未选中状态转换为选中状态(即检查状态的任何更改都会触发事件)

答案 4 :(得分:0)

其他答案是正确的,但是错过了潜在问题的原因。 选中单选按钮时,发送的第一个事件是未选中项的更改 但是,如果通过控件名称检查其状态,则仍会看到其旧的检查状态,因为该表单尚未更新。要查看其真实状态,您需要转换发送者对象。 这样,您可以根据需要执行与被取消选择的条件有关的任何操作。

在以下常见情况下,多个单选按钮将发送到同一处理程序事件。 在这里仅检查发件人的状态是否被检查是行不通的,因为我们需要根据按下的单选按钮执行不同的操作。 因此,首先我们忽略所有未经检查的发件人。 然后我们按照控件名称识别出检查过的发件人,以处理正确的操作。

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
    }

}

答案 5 :(得分:-1)

您可以为每个RadioButton设置AutoCheck属性为true,然后捕获Click事件而不是CheckChanged事件。这将确保只触发一个事件,并且处理程序中的逻辑可以强制发送者在需要处理单击时键入RadioButton。如果处理程序逻辑很简单,通常可以避免强制转换。这是一个处理三个控件的示例,rbTextNumeric,rbTextFixed和rbTextFromFile:

        private void rbText_Click(object sender, EventArgs e)
    {
       flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked;
       txtBoxTextFixed.Enabled = rbTextFixed.Checked;
       flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked;
    }

答案 6 :(得分:-1)

{
    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";
            }
        }

    }
}