Событие ListBox Click теряется, когда фокус установлен на TabControl - PullRequest
0 голосов
/ 25 января 2019

Я работаю с проектом Visual Basic.NET в Visual Studio 2017 (.NET Framework 4.6.1)

Я использую список, связанный с BindingSource.

Список находится внутри одной панели SplitterControl.

У меня также есть TabControl, расположенный в другой панели SplitterControl. Этот элемент управления содержит дочерние данные, связанные с элементами в ListBox, и обновляется при нажатии ListBox и последующем выборе элемента в ListBox. Событие Click обновляет древовидное представление, которое затем заполняет TabControl данными, если / когда (1) щелкается узел дерева и (2) извлекаются соответствующие данные для этого узла.

Событие щелчка списка работает нормально, если последовательно щелкать различные элементы только в списке.

Однако, если щелкнуть мышью в TabControl (на другой панели SplitterControl), то после щелчка по исходному списку, событие Click не срабатывает.

Я исследовал эту проблему (на StackOverFlow, а также на других форумах), и предложения в основном вращались вокруг идеи, что событие Click может быть вызвано вызовом подпрограммы, настроенной как обработчик события Click (например, myListBox_Click).

Я пробовал это, но проблема в том, что я теряю текущее значение SelectedIndex / SelectedValue.

Для иллюстрации, воспроизведя проблему в приложении, где я столкнулся с проблемой:

Соответствующее приложение (обратите внимание на список, выделенный красной стрелкой - снимок экрана 1):

Скриншот 1

После запуска приложения список работает так, как должен, если пользователь нигде больше не щелкает, выбирая только различные элементы в списке. TabControl (показанная начальная вкладка всегда является вкладкой Profile) обновляется соответствующим образом.

Однако, если в любой момент щелкнуть мышью в TabControl (например, чтобы выбрать другую вкладку, обратите внимание на снимок экрана 2)

Скриншот 2

Теперь, когда пользователь нажимает на другой элемент в списке, выбирается неправильный элемент (показан на снимке экрана 3):

Скриншот 3

Событие Click теперь вызывается с помощью вызова MyListBox_Click внутри события TabControl_Leave; я думал, что это подходящее место для вызова подпрограммы. Мое рассуждение состояло в том, что когда в этом сценарии щелкали по списку, первым событием, которое я запустил (насколько я мог судить), было событие TabControl_Leave.

Не удивительно, что если впоследствии щелкнуть тот же элемент в списке (в данном примере Allegheny), то результатом будет то, что должно было произойти при предыдущем щелчке (что SelectedValue является правильным, как видно на снимке экрана 4) :

Скриншот 4

Конечно, это правильно, поскольку последний щелчок произошел, когда список уже был активным элементом управления.

Я пробовал несколько подходов, таких как (1) использование глобальной переменной для хранения текущего индекса / значения и ее извлечение, и (2) использование свойства Tag в TabControl для хранения и извлечения одного и того же значения. Это либо работало непоследовательно, либо не работало вообще из-за порядка срабатывания событий управления.

Надеюсь, я достаточно ясно понял природу моей проблемы / вопроса.

У кого-нибудь есть идеи по поводу моего следующего подхода? Любые идеи / идеи / предложения, безусловно, будут высоко оценены.

Заранее спасибо,

Крис Флитвуд

Разработчик программного обеспечения

Партнерство детей Северной Каролины (SmartStart)

...