将焦点设置为TabControl

时间:2019-01-25 14:02:11

标签: vb.net listbox selectedvalue

我正在使用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事件。 / p>

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

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

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

Screenshot 1

启动应用程序后,如果用户没有其他点击,列表框将按照其应有的方式运行,仅在列表框中选择各种项目。 TabControl(显示的初始选项卡始终是“配置文件”选项卡)将相应刷新。

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

Screenshot 2

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

Screenshot 3

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

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

Screenshot 4

当然,这是正确的,因为上一次单击是在列表框已经是活动控件的时候发生的。

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

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

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

预先感谢

克里斯·弗利特伍德

软件开发人员

北卡罗莱纳州儿童合作伙伴关系(SmartStart)

0 个答案:

没有答案