【发布时间】:2020-04-10 00:03:07
【问题描述】:
我正在处理的代码遇到一个非常奇怪的问题。我有一个表格布局面板,其中包含两个较小的表格布局面板。一个包含 6 个单选按钮来处理 SMEMA 模式,而另一个包含处理传送带操作(加载、倒带)的按钮。
嵌套在传送带按钮的单击事件处理程序中,我有一个功能可以在运动处于活动状态时禁用按钮(下面的部分)。我发现当线路调用禁用倒带按钮时,单选按钮的 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 事件移到调用堆栈中的更高位置来触发它,以便在单击 Rewind 按钮时立即调用它。但是,尽管位于两个单独的嵌套面板中,但除了共享相同的通用表格布局面板之外,我找不到两者之间的任何链接。
有没有人经历过这样的事情?
编辑:通过更多故障排除,我已经确认某些东西正在滴入单选按钮。我在 _buttonConveyorRewind.Enabled = isIdle; 行上方添加了一个 foreach 语句,该语句禁用了表格布局面板中的每个单选按钮。这也重新启用了它们,因为一旦传送带的移动完成,它就会通过附加的代码返回。
foreach (RadioButton button in tableLayoutPanel22.Controls)
{
button.Enabled = isIdle;
}
我还必须在主面板上调用 Focus 事件,以防止面板跳到单选按钮面板下方。这似乎阻止了单选按钮的更改,并且机器本身的 SMEMA 模式也保持一致。似乎某处的 Focus 事件正在向下传播并导致单选按钮发生变化。
【问题讨论】:
-
RadioButtons 的
Enter事件是否已订阅并执行某些操作?或者任何其他与焦点变化相关的事件?也许在输入一个(或类似的东西)时会改变 RadioButtons 的 Checked 状态?或者任何其他控件,当它接收到焦点时,以某种方式激活 RadioButtons? -
所有单选按钮上的唯一事件是 CheckedChanged 事件。我还在对面板或单选按钮的每个引用上都设置了中断,但我仍然发现相同的行为。当我单击按钮时,它会启动机器中的移动过程,该过程会逐渐下降到启用/禁用按钮的功能。一旦它按下倒带按钮的禁用,它会立即跳转到 CheckedChanged 事件。我什至已经将其注释掉并将其移到调用堆栈中的更高位置,并且仍然显示相同的行为。除了创建一个解决方法之外,不知道该去哪里。
-
当您提到移动过程、倒带按钮、将其移到更高位置时,我确定您知道您指的是什么调用堆栈,但很可能没有其他人这样做。您应该发布可以重现此行为的代码。测试此代码的框架和系统版本也很重要。 --- 你明白 RadioButtons 不会自己引发事件。由于级联焦点更改事件,必须设置 Checked/CheckedState 或触发它。
-
吉米,谢谢你在这里的帮助。我知道帖子不是很清楚,但我不确定我可以分享什么。它还需要添加大量代码和解释。最后,您似乎是正确的,有一些事件正在发生并渗入单选按钮并导致更改。我可以通过添加一个禁用每个单选按钮的 foreach 循环来避开这一点,因为无论如何它们都不应该在进程处于活动状态时进行更改。一旦我这样做了,问题就消失了,点击后的焦点也发生了变化。感谢您的帮助!