禁用面板中的按钮会触发面板中单选按钮的CheckedChanged事件

时间:2020-04-10 00:03:07

标签: c# winforms events

我正在处理的代码遇到一个非常奇怪的问题。我有一个表布局面板,其中包含两个较小的表布局面板。一个包含6个用于处理SMEMA模式的单选按钮,而另一个包含用于处理传送带操作(加载,倒带)的按钮。

嵌套在传送带按钮的click事件处理程序中,我有一个功能,可在运动处于活动状态时禁用按钮(下面的部分)。我发现当线路呼叫禁用快退按钮时,单选按钮的CheckedChanged事件突然触发。注意:这是仅当选择6个按钮中的一个

bool isIdle = state.IsIdle;

//process tab
_buttonStartupRoutine.Enabled = isIdle;
_ckbuttonPLCRun.Enabled = true;
_buttonCameraMode.Enabled = isIdle;
_checkBoxDryRun.Enabled = isIdle;
_updownJogScale.Enabled = isIdle;
_buttonConveyorLoad.Enabled = isIdle;
_buttonConveyorUnload.Enabled = isIdle;
_buttonConveyorRewind.Enabled = isIdle;
_updownConveyorWidth.Enabled = isIdle;

我已经确认此行通过将其移到调用堆栈中的较高位置来引发CheckedChanged事件,因此单击“倒带”按钮时将立即调用该事件。但是,尽管它们位于两个单独的嵌套面板中,但是除了共享相同的常规表布局面板之外,我找不到两者之间的任何链接。

有人经历过这样的事情吗?

编辑:通过更多的故障排除,我已经确认单选按钮中滴入了一些东西。我在表示 _buttonConveyorRewind.Enabled = isIdle; 的行上方添加了一个foreach语句,该语句禁用了表格布局面板中的每个单选按钮。这也重新启用了它们,因为一旦传送带移动完成,它就会通过附加的代码返回。

foreach (RadioButton button in tableLayoutPanel22.Controls)
{
     button.Enabled = isIdle;
}

我还必须在主面板上调用Focus事件,以防止面板跳到单选按钮面板下方。这似乎阻止了单选按钮的更改,并且机器本身的SMEMA模式也保持一致。似乎某个地方的“焦点”事件正在滴灌并导致单选按钮发生更改。

1 个答案:

答案 0 :(得分:0)

事实证明,一个事件正在滴入面板或单选按钮中。我的解决方案是在禁用传送带按钮之前,使用foreach语句禁用每个单选按钮。这似乎阻止了事件更改按钮,因为单击时它们被禁用了。我还必须在主面板上手动调用Focus(),以将焦点恢复到滚动区域的顶部。这将确认某种焦点事件正在导致单选按钮认为它们正在更改。我已在下面添加了代码更改。

foreach (RadioButton button in tableLayoutPanel22.Controls)
{
    button.Enabled = isIdle;
}
_Panel_Main.Focus();
相关问题