2014-03-12 44 views
2

我绝对没有编程链接或属性设置,使得我的CheckedChanged由于除检查单选按钮之外的任何内容而触发。但是,当我点击一个不相关的,不相关的按钮时,按钮的点击处理程序会触发(这是预期的)。在这个点击处理程序中,该按钮会自行禁用(它会重新启用不同按钮的单击),然后触发myRadioButton_CheckedChanged句柄来处理不相关的单选按钮。设置myButton.Enabled = true会导致单选按钮的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; 
     } 
    } 
+0

其实我可以证实这种奇怪的行为。让我挖。 –

回答

2

好,知道了。

检查Button和RadioButton上的TabOrder。

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

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

干杯

编辑:

这似乎是一个已知的问题,因为我刚刚发现这个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

+0

这听起来似乎合理,噢,我的天啊。稍后回来,你那聪明的回应者,你。 <3(虽然这个解决方法很hacky -_-) –

+0

我听到你的声音。我第一次看到这种情况。 –

+0

你懂了;非常感谢。这绝对是一个错误。 –

1

好了,它有点哈克,但它的工作原理不做改变的选项卡顺序:

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

     SendKeys.SendWait("{Tab}"); 

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

这是否甚至编译? –

+0

我的问题是修辞。你的代码不能编译。请确保您发布相关代码。 –

+0

我没有去尝试这个,但上面的答案似乎有点优雅。谢谢@Crono。 –

相关问题