Различать между вкладкой и щелчком мыши при вводе объекта - PullRequest
0 голосов
/ 26 февраля 2020

Есть ли способ сделать это? У меня есть DataGridView с именем dgv1. dgv1 не различает, когда пользователь использует щелчок мыши или вкладку для ввода его под dgv1.Enter.

Private Sub dgv1_Enter(sender As Object, e As System.EventArgs) Handles dgv1.Enter

'Whether I click or enter by tabbing, it doesn't matter. This gets triggered first before CellClick or MouseClick/MouseDown.

End Sub

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

1 Ответ

1 голос
/ 27 февраля 2020

Функциональность, которую вы ищете, определена в Классе ContainerControl .

Из раздела Замечаний документации ContainerControl (выделение добавлено):

ContainerControl представляет элемент управления, который может функционировать в качестве контейнера для других элементов управления и обеспечивает управление фокусом. Элементы управления, которые наследуются от этого класса, могут отслеживать активный элемент управления, который они содержат, даже когда фокус перемещается куда-то в другом контейнере.

Объекты ContainerControl предоставляют логическую границу для содержащихся элементов управления. Контейнерный элемент управления может захватывать нажатие клавиши TAB и перемещать фокус на следующий элемент управления в коллекции.

Специально для достижения вашей цели вы можете переопределить ContainerControl. ProcessTabKey (Boolean) Метод элемента управления ближайшего предка Datagridview, который является ContainerControl; обычно это будет сама форма.

Таким образом, предполагая, что Datagridview не содержится в SplitPanel или UserControl, вы можете добавить следующие коды c к коду формы.

Protected Overrides Function ProcessTabKey(forward As Boolean) As Boolean
  ' call the base method to select the next control 
  Dim ret As Boolean = MyBase.ProcessTabKey(forward)

  If ActiveControl Is DataGridView1 AndAlso DataGridView1.RowCount > 0 Then
    DataGridView1.ClearSelection()
    DataGridView1.CurrentCell = DataGridView1.Rows(0).Cells(0)
    DataGridView1.Rows(0).Selected = True
  End If
  Return ret
End Function
...