9

我正在学习如何使用 Visual Basic Express 2008 开发 Windows 窗体应用程序,我的测试/学习应用程序有一个 TabControl 和几个测试页(例如,3 个,这里的数字不相关)。

现在,我正在处理 Tabcontrol 上的 MouseClick 事件,我似乎无法弄清楚如何获取单击了哪个选项卡。我相信如果我单击选项卡条的另一个位置,则不会触发 MouseClick 事件,因此必须单击一个选项卡。问题是,哪个是标签?

任何帮助,将不胜感激。谢谢!

4

2 回答 2

19

不要使用该MouseClick事件,因为还有另一个更适合此目的的事件:(
注意:在 OP 发表评论后编辑。)

TabControl有财产SelectedIndex。_ 这是当前选定选项卡的从零开始的编号。(还有另一个属性叫做SelectedTab,直接引用选中的标签页对象。)

您可以将事件处理程序与事件SelectedIndexChanged挂钩,以便在用户选择另一个选项卡时收到通知:

Private Sub MyTabControl_SelectedIndexChanged(ByVal sender As Object, _
                                              ByVal e As System.EventArgs) _
            Handles MyTabControl.SelectedIndexChanged

    Dim indexOfSelectedTab As Integer = MyTabControl.SelectedIndex
    Dim selectedTab As System.Windows.Forms.TabPage = MyTabControl.SelectedTab

    ...

End Sub

(请注意,您可能还需要保护您的代码免受SelectedIndex具有无效值的情况,例如-1。)

编辑(在OP评论后添加)

如果SelectedIndexChanged不适合您,因为您需要捕获用户对所有鼠标按钮的操作,您可以使用如下GetTabRect方法TabControl

Private Sub MyTabControl_MouseClick(sender As Object, _
                                    e As System.Windows.Forms.MouseEventArgs) _
            Handles MyTabControl.MouseClick

    ...

    For tabIndex As Integer = 0 To MyTabControl.TabCount - 1
        If MyTabControl.GetTabRect(tabIndex).Contains(e.Location) Then
           ...  ' clicked on tab with index tabIndex '
        End If
    Next

    ...

End Sub
于 2010-02-12T09:12:51.700 回答
3

我用来处理这个问题的最简单方法是对每个标签页的事件使用 ENTER 和 LEAVE 事件。例如,我有它,这样当我离开第一页时,它会将我的 datagridview 的可见属性更改为 False,当我输入它时,它会将其转回 True 并为我的表加载数据。

Private Sub TabPage1_Enter(sender As System.Object, e As System.EventArgs) Handles TabPage1.Enter
    DataGridView1.Visible = True
    Load_Table()
End Sub

Private Sub TabPage1_Leave(sender As System.Object, e As System.EventArgs) Handles TabPage1.Leave
    DataGridView1.Visible = False
End Sub

如果您想更改控件上的文本或类似的东西,我想 index 方法将是选择的方式,但只是要知道单击了哪个选项卡,这就是这两个事件的用途。

于 2015-07-04T13:46:16.130 回答