在tabcontrol MouseClick事件上单击了哪个选项卡

时间:2010-02-12 08:49:54

标签: vb.net winforms tabcontrol mouseclick-event

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

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

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

2 个答案:

答案 0 :(得分:15)

不要使用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

答案 1 :(得分:2)

我用来处理这个问题的最简单方法是对每个标签页的事件使用ENTER和LEAVE事件。例如,我有它,所以当我离开第一页时,它将visible属性更改为我的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

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