【问题标题】:Disabling a button in a panel triggers CheckedChanged event on radio buttons in panel禁用面板中的按钮会触发面板中单选按钮上的 CheckedChanged 事件
【发布时间】: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 循环来避开这一点,因为无论如何它们都不应该在进程处于活动状态时进行更改。一旦我这样做了,问题就消失了,点击后的焦点也发生了变化。感谢您的帮助!

标签: c# winforms events


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多