首页 > 解决方案 > 当焦点设置为 TabControl 时,ListBox Click 事件丢失

问题描述

我正在使用 Visual Studio 2017 (.NET Framework 4.6.1) 中的 Visual Basic.NET 项目

我正在使用与 BindingSource 关联的列表框。

列表框包含在 SplitterControl 的一个窗格中。

我还有一个 TabControl 位于 SplitterControl 的另一个窗格中。此控件包含与 ListBox 中的项目相关联的子数据,并且在单击 ListBox 并且随后在 ListBox 中选择项目时刷新。Click 事件刷新 Treeview,然后在 (1) 单击树节点和 (2) 为该节点检索适当数据时使用数据填充 TabControl。

仅在列表框中连续单击不同项目时,列表框单击事件工作正常。

但是,一旦鼠标单击 TabControl(在 SplitterControl 的另一个窗格中),然后单击初始列表框,Click 事件就不会触发。

我已经研究过这个问题(在 StackOverFlow 以及其他论坛上),建议基本上围绕这样的想法,即可以通过调用设置为 Click 事件处理程序的例程(例如 myListBox_Click)来强制执行 Click 事件。

我已经尝试过了,但问题是我丢失了当前的 SelectedIndex / SelectedValue。

通过在我遇到问题的应用程序中重现问题来说明:

有问题的应用程序(注意由红色箭头突出显示的列表框 - 屏幕截图 1):

截图 1

在应用程序启动时,如果用户没有点击其他地方,Listbox 会正常运行,只会选择 Listbox 中的各种项目。TabControl(显示的初始选项卡始终是 Profile 选项卡)相应地刷新。

但是,如果在任何时候,在 TabControl 中单击鼠标(例如,要选择另一个选项卡,请注意屏幕截图 2)

截图 2

现在,当用户单击列表框中的另一个项目时,选择了错误的项目(如屏幕截图 3 所示):

截图 3

现在通过在 TabControl_Leave 事件中调用 MyListBox_Click 来强制 Click 事件;我的想法是,这是放置子例程调用的合适位置。我的理由是,在这种情况下单击列表框时,第一个触发的事件(据我所知)是 TabControl_Leave 事件。

毫不奇怪,如果随后单击列表框中的同一项目(在此示例场景中为 Allegheny),则结果应该是前一次单击时发生的情况(即 SelectedValue 是正确的,如屏幕截图 4 所示):

截图 4

当然,这是正确的,因为在 Listbox 已经是活动控件时发生了最后一次单击。

我尝试了几种方法,例如 (1) 使用全局变量来存储当前索引/值并检索它,以及 (2) 使用 TabControl 的 Tag 属性来存储和检索相同的值。由于控制事件触发的顺序,这要么不一致,要么根本不工作。

希望我对我的问题/问题的性质已经足够清楚了。

有人对我的下一个方法有什么想法吗?当然,任何想法/见解/建议都将不胜感激。

提前致谢,

克里斯弗利特伍德

软件开发人员

北卡罗来纳州儿童伙伴关系 (SmartStart)

标签: vb.netlistboxselectedvalue

解决方案


推荐阅读