C# 设置myButton.Enabled=true会导致radiobutton';s checked已将处理程序更改为激发

C# 设置myButton.Enabled=true会导致radiobutton';s checked已将处理程序更改为激发,c#,winforms,events,radio-button,focus,C#,Winforms,Events,Radio Button,Focus,我绝对没有设置任何编程链接或属性,因此除了检查单选按钮外,我的CheckedChanged会因任何原因触发 但是,当我单击另一个不相关的按钮时,该按钮的单击处理程序将触发(这是预期的)。在此单击处理程序中,按钮禁用自身(在其他按钮单击时重新启用),然后触发不相关radiobutton的myRadioButton_CheckedChanged句柄 我看到的调用堆栈本质上是 myRadioButton_CheckedChanged(…) myButton_单击(…) 主要(…) myButton_C

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

但是,当我单击另一个不相关的按钮时,该按钮的单击处理程序将触发(这是预期的)。在此单击处理程序中,按钮禁用自身(在其他按钮单击时重新启用),然后触发不相关radiobutton的myRadioButton_CheckedChanged句柄

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

myRadioButton_CheckedChanged(…) myButton_单击(…) 主要(…)

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;
        }
    }
好的,明白了

检查按钮和RadioButton上的TabOrder

似乎当您禁用按钮时,焦点会转移到下一个控件,可能是您的单选按钮,从而使其处于选中状态

在我从开始的测试中,我所要做的就是确保RadioButton的标签顺序不在按钮后面

干杯

编辑:


这似乎是一个已知的问题,因为我刚刚发现了这个MSDN线程:

好的,它有点黑客行为,但它在不改变任何选项卡顺序的情况下工作:

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

        SendKeys.SendWait("{Tab}");

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

事实上,我可以证实这种奇怪的行为。让我挖掘一下。这算是编译吗?我的问题是修辞性的。您的代码无法编译。请确保你发布了相关的代码。我没有尝试这个,但上面的答案似乎更优雅了一点。谢谢@Crono@MarkS,正如我所说,我最初的答案只是猜测。我缺少的部分是声明一个新的
操作
对象。我测试了更正后的代码,但无论如何都不起作用。然而,我确实找到了另一种方法来解决这个问题,而不影响标签顺序。请参阅我编辑的答案。:)@Lucmorin先生,请你重新考虑一下你的投票结果好吗?谢谢。这听起来很有道理,天哪。马上就回来,你这个出色的反应者,你。我听到了。我第一次看到这种情况,你明白了;非常感谢。这绝对是一个错误。我第一次看到这个,我也吓坏了P