В проекте, над которым я работаю, я создал экранную клавиатуру, которая предназначена для ввода в TextBoxes или DataGridViewCells.
Я пытаюсь добиться этого с помощью нескольких методов и переменных.Во-первых, есть глобальная переменная с именем CurrentFocus
, которая представляет собой объект, для которого задан тот объект, на который был направлен самый последний фокус, который может вводить клавиатура.Эта переменная была создана потому, что в VB.Net не существует метода стиля LastFocus
.
Я устанавливаю значение CurrentFocus
, добавляя простые обработчики событий в текстовые поля, которыми я будуищем данные следующим образом:
Dim randomTextbox As New Textbox
AddHandler randomTextbox.GotFocus, AddressOf TextboxGainsFocus
Private Sub TextboxGainsFocus(sender as Textbox, e As EventArgs)
CurrentFocus = sender
End Sub
Что касается набора текста в самих текстовых полях, каждая клавиша на клавиатуре вызывает следующий метод, причем значение параметра является заглавной буквой любой нажатой клавиши (Таким образом, нажатие клавиши «B» отправляет «B» в качестве параметра)
Private Sub KeypadPress(ByCal key As Char)
If TypeOf CurrentFocus Is TextBox Then
If Char.IsDigit(key) Then
CType(CurrentFocus, Textbox).Text &= key
Else
If shiftActive Then
CType(CurrentFocus, Textbox).Text &= key
Else
CType(CurrentFocus, Textbox).Text &= Char.ToLower(key)
End If
End If
End If
End Sub
У меня точно нет способа легко настроить клавишу Shift, которую вы удерживаете, поэтому я настроил«Shift» будет похож на Caps Lock, где вы просто включаете или выключаете его.В этом смысл логического значения shiftActive
.
Теперь весь приведенный выше код работает отлично.Моя проблема сейчас заключается в том, что я не могу заставить его работать с DataGridViewCells.Сначала я попытался добавить аналогичный EventHandler к сетям данных, которые я использую
Dim randomGrid As New DataGridView
AddHandler randomGrid.GotFocus, AddressOf GridGainsFocus
Private Sub GridGainsFocus(sender As DataGridView, e As EventArgs)
CurrentFocus = sender.CurrentCell
End Sub
И я попытался добавить случай ElseIf
в метод KeypadPress
, который определяет, когда CurrentFocus
является DataGridViewCell,Это отлично работает.Моя проблема в том, что в нем либо не выбрана правильная ячейка, либо он просто ничего не делает.
Например, допустим, у меня есть 3 строки и 3 столбца в моем DataGridView.Я выбираю ячейку (2,2) и затем нажимаю клавишу на клавиатуре.Если я поставлю точку останова, чтобы увидеть значение CurrentFocus
, когда метод KeypadPress
срабатывает, он показывает CurrentFocus
как Cell (0,0).
Это не всегда происходитхоть.Иногда я получаю его случайным образом (и он кажется случайным), установленным в качестве подходящей ячейки, но пробую что-то вроде
CType(CurrentFocus, DataGridViewCell).Value &= key
В моем методе Keypress ничего не делается для изменения значения DataGridViewCell.
Так что именно мне нужно сделать?Есть ли способ настроить каждую ячейку так, чтобы у нее был свой обработчик, и чтобы он работал таким образом?Как бы я сделал так, чтобы я мог изменить значение самих ячеек?
Спасибо за помощь.