Я работаю с проектом 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)