Отключение кнопки на панели вызывает событие CheckedChanged на переключателях на панели - PullRequest
0 голосов
/ 10 апреля 2020

Я столкнулся с очень странной проблемой с кодом, над которым я работаю. У меня есть панель макета таблицы, которая содержит две меньшие панели макета таблицы. Один содержит 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, перемещая его выше в стеке вызовов, поэтому он вызывается немедленно, когда кнопка перемотки нажата. Однако я не могу найти никакой связи между ними, кроме как использовать одну и ту же общую панель макета таблицы, несмотря на то, что она находится в двух отдельных вложенных панелях.

Кто-нибудь когда-либо испытывал что-то подобное?

РЕДАКТИРОВАТЬ : С большим количеством устранения проблем я подтвердил, что что-то стекает в переключатели. Я добавил оператор foreach над строкой с надписью _buttonConveyorRewind.Enabled = isIdle; , которая отключает все переключатели на панели макета таблицы. Это также снова активирует их, потому что оно возвращается через прикрепленный код после завершения движения конвейера.

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

Мне также пришлось вызвать событие Focus на главной панели, чтобы предотвратить прыжок панели внизу панели переключателей. Похоже, это помешало переключению радиокнопок, и режим SMEMA самой машины также оставался неизменным. Казалось бы, событие Focus где-то стекало вниз, и переключатели переключались.

1 Ответ

0 голосов
/ 10 апреля 2020

Оказывается, событие происходило на панели или переключателях. Мое решение состояло в том, чтобы отключить каждую радио-кнопку с помощью оператора foreach перед отключением конвейерных кнопок. Это, казалось, препятствовало тому, чтобы событие изменило кнопки, так как они были отключены, когда оно нажало. Мне также пришлось вручную вызвать Focus () на главной панели, чтобы вернуть фокус к вершине области прокрутки. Это подтвердит, что какое-то событие фокуса заставляет переключатели думать, что они меняются. Я включил изменение кода ниже.

foreach (RadioButton button in tableLayoutPanel22.Controls)
{
    button.Enabled = isIdle;
}
_Panel_Main.Focus();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...