【问题标题】:Which tab was clicked on tabcontrol MouseClick event在 tabcontrol MouseClick 事件上单击了哪个选项卡
【发布时间】:2010-02-12 08:49:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: vb.net winforms tabcontrol mouseclick-event


    【解决方案1】:

    不要使用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 对您不起作用,因为您需要捕捉用户对所有鼠标按钮的操作,您可以像这样使用TabControlGetTabRect 方法

    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
    

    【讨论】:

    • 这适用于普通的鼠标点击,但是中键点击呢?中键单击不会更改选定的选项卡。不过,谢谢你,这个案例现在可以工作了,但我还需要检查哪个选项卡被中键点击了。我应该打开一个新问题吗?
    • 这是一个不同的问题,但现在请参阅我的扩展答案。
    • 你有没有发现如何完成中间点击?
    • @Pedro,请阅读我回答的第二部分。您需要做的就是将If 条件更改为:MyTabControl.GetTabRect(…).Contains(…) AndAlso e.Button = MouseButtons.Middle。我刚试过,就像一个魅力。您将知道tabIndex 变量单击了哪个选项卡。你可以例如将其用作MyTabControl.TabPages 集合的索引。
    【解决方案2】:

    我用来处理这个问题的最简单方法是对每个标签页的事件使用 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 方法将是选择的方式,但只是要知道单击了哪个选项卡,这就是这两个事件的用途。

    【讨论】:

      猜你喜欢
      • 2017-09-29
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多