我绝对没有设置编程链接或属性,这样除了检查单选按钮外,我的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;
}
}
答案 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;
}
}