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

Muh*_*dar 28 c# oncheckedchanged radio-button winforms

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

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

这是我的代码:

private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
    //My Code
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*all 64

正如其他答案者正确地说的那样,事件被触发两次,因为每当一个组中的一个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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 难道你不认为'if (rb != null)' 是不必要的吗? (2认同)
  • @MuhammadAliDildar它避免了任何空引用异常的可能性 - 当然,因为你连接所有事件,你可以非常肯定这个事件处理程序只会附加到radiobutton,但是'最佳实践'的做事方式是检查演员是否有效.然后再次 - 从某个角度来看,当您错误地附加事件处理程序时抛出异常可能更可取,因此您可以修复代码. (2认同)

kma*_*zek 5

每当 Checked 属性更改时,都会引发 CheckedChanged。如果您选择 RadioButton,则取消选中之前选择的 RadioButton(触发 CheckedChanged),然后选中新的 RadioButton(触发 CheckedChanged)。


jal*_*eel 5

要避免它,只需检查是否radioButton已选中

例如:

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