Какая вкладка была нажата на событии tabcontrol MouseClick - PullRequest
8 голосов
/ 12 февраля 2010

Я учусь разрабатывать приложения Windows Forms с помощью Visual Basic Express 2008, и в моем приложении для тестирования / обучения есть TabControl с несколькими тестовыми страницами (например, число 3 здесь не имеет значения).

Теперь я передаю событие MouseClick на Tabcontrol, и я не могу понять, как узнать, на какой вкладке щелкнули. Я считаю, что событие MouseClick не срабатывает, если я щелкаю в другом месте полосы вкладок, поэтому, должно быть, была нажата вкладка. Проблема в том, какая вкладка была?

Любая помощь будет оценена. Спасибо!

Ответы [ 2 ]

15 голосов
/ 12 февраля 2010

Не используйте событие MouseClick, потому что есть другое событие, более подходящее для этой цели:
(Примечание: отредактировано после того, как ОП опубликовал комментарий.)

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.)

Редактировать (добавлено после комментария ОП) :

Если 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
2 голосов
/ 04 июля 2015

Самый простой способ, которым я использую это, - использовать события 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

Если вы хотите изменить текст в элементе управления или что-то в этом роде, я полагаю, что метод индекса был бы лучшим выбором, но просто чтобы узнать, на какой вкладке нажали, для чего предназначены эти два события.

...