设置myButton.Enabled = true会导致radiobutton的CheckedChanged处理程序触发

时间:2014-03-12 23:45:20

标签: c# winforms events radio-button focus

我绝对没有设置编程链接或属性,这样除了检查单选按钮外,我的CheckedChanged会因任何事情而触发。

然而,当我点击一个不同的,不相关的按钮时,按钮的点击处理程序会触发(这是预期的)。在此单击处理程序中,该按钮禁用自身(它在不同按钮的单击时重新启用),然后触发myRadioButton_CheckedChanged句柄以获取无关的单击按钮。

我看到的调用堆栈基本上是

myRadioButton_CheckedChanged(...) myButton_Click(...) 主(...)

myButton_Click中触发myRadioButton_CheckedChanged的行显然是

myButton.Enabled = false;

相关代码是:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        // L-R
        if (radioButton1.Checked == true)
        {
            orientation_left = 3;
            pictureBox2.Invalidate();
            Debug.Print("left {0}", orientation_left);
        }
    }

private void select1_Click(object sender, EventArgs e)
    {
        Debug.Print("select1click");

        if (select1Down == false)
        {
            // ... stuff
            select1.Enabled = false;        // Causing the CheckedChanged to fire
            select2.Enabled = false;
            select1Down = true;
        }
    }

2 个答案:

答案 0 :(得分:2)

好的,明白了。

检查Button和RadioButton上的TabOrder。

似乎当你禁用Button时,焦点会转移到下一个控件,这可能是你的RadioButton,导致它被检查。

在我的测试中,我所要做的就是确保RadioButton的TabOrder不在Button之后。

干杯

编辑:

这似乎是一个已知问题,因为我刚刚找到了这个MSDN主题:http://social.msdn.microsoft.com/Forums/windows/en-US/77fbec3b-1f63-42e1-a200-19b261b63794/the-radiobutton-clicked-event-is-fired-without-the-radio-button-beeing-clicked-?forum=winforms

答案 1 :(得分:1)

好吧,它有点像hacky但它​​的工作原理没有改变Tab键顺序:

private void select1_Click(object sender, EventArgs e)
{
    if (!select1Down)
    {
        // ... stuff

        SendKeys.SendWait("{Tab}");

        select1.Enabled = false;
        select2.Enabled = false;
        select1Down = true;
    }
}