Определить, когда выбран DataGridViewCell / получает фокус в VB.Net - PullRequest
0 голосов
/ 08 февраля 2019

В проекте, над которым я работаю, я создал экранную клавиатуру, которая предназначена для ввода в 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.

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

Спасибо за помощь.

1 Ответ

0 голосов
/ 11 февраля 2019

Итак, я разобрался, как исправить свою проблему, и пошагово расскажу об этом для всех, у кого эта проблема возникнет в будущем.

Сначала я добавил обработчик событий в свой DataGridView, которыйработает аналогично моему обработчику событий для моих текстовых полей.

Dim exGrid As DataGridView
AddHandler exGrid.CellEnter, AddressOf GridGainsFocus

Private Sub GridGainsFocus(sender As DataGridView, e As EventArgs)
    CurrentFocus = sender.CurrentCell
End Sub

Способ, которым это работает, заключается в том, что DataGridViewCells не может получить фокус.Только сам DataGridView может получить фокус.Скорее сами Клетки устанавливаются как «Выбранные», когда они «сфокусированы».Таким образом, вам нужно использовать событие CellEnter, которое срабатывает всякий раз, когда пользователь выбирает ячейку.Теперь перейдем к моему методу нажатия клавиш.

Private Sub KeypadPress(ByVal key As Char)
    If TypeOf CurrentFocus Is TextBox Then
        Me.ActiveControl = CurrentFocus
        If Char.IsDigit(key) Then
            SendKeys.SendWait(key)
        Else
            If shiftActive Then
                SendKeys.SendWait(key)
            Else
                SendKeys.SendWait(Char.ToLower(key))
            End If
        End If
    ElseIf TypeOf CurrentFocus Is DataGridViewCell Then
        If CType(CurrentFocus, DataGridViewCell).ReadOnly = False THen
            If Char.IsDigit(key) Then
                If CType(CurrentFocus, DataGridViewCell).Value.Equals(0) Then
                    CType(CurrentFocus, DataGridViewCell).Value = key
                Else
                    CType(CurrentFocus, DataGridViewCell).Value &= key
                End If
            End If
        End If
    End If
End Sub

Так что я пойду через это сверху вниз.Во-первых, вы заметите, что я изменил код для обработки нажатий клавиш при попытке ввода данных в TextBox.Это связано с тем, что для моих текстовых ящиков они настроены на автозаполнение данных, что облегчает поиск по данным.Моя первая установка, представленная в моем исходном вопросе, не позволяла использовать данные автозаполнения, потому что никакие фактические нажатия клавиш не запускались.

Итак, с внесенными мною изменениями код теперь выполняет следующие действия:

  1. При нажатии кнопки, если объект CurrentFocus имеет тип TextBox, он меняет текущий фокус на этот объект.
  2. Инициирует событие SenKey.Это вызовет автозаполнение TextBox.

Теперь для DataGridViewCells.Когда я устанавливаю объект CurrentFocus в DataGridViewCell с помощью моего метода GridGainsFocus, объект сохраняет идеальную ссылку на эту ячейку.Так что все, что мне нужно сделать, это изменить значение этой ячейки.

Теперь для целей моей программы я хочу, чтобы пользователь только помещал в ячейки цифровые значения, поэтому у меня есть IsDigit, еслизаявление.А конкретный If value.Equals(0) настроен на то, чтобы при значении по умолчанию 0 в ячейке при нажатии клавиши «5» для ввода текста не было установлено значение «05», а скорее «5».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...