caffrey_1 Ответов: 2

Лучший способ запустить событие при изменении текстового поля


У меня есть USB-кард-ридер mifare, который при предъявлении карты действует как клавиатура и выплевывает 10-значное число.
Скажем у меня есть текстовое поле в качестве выбранного по умолчанию элемента управления пользователь кладет карточку на считыватель и номер считывается в текстовое поле
То, что я пытаюсь сделать, - это иметь скрытый элемент управления, который запускает событие после считывания 10 цифр.
Странно то, что у меня это уже однажды работало!

Что я уже пробовал:

Это просто ждет большего ввода :-


Private Sub TextBox1_Leave(sender As System.Object, e As System.EventArgs) Handles TextBox1.Leave

        msgbox(textbox1.text.tostring)

End Sub

'This just reads the first character

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged

    MsgBox(TextBox1.Text.ToString)
    


End Sub

2 Ответов

Рейтинг:
2

caffrey_1

Думаю, я мог бы решить эту проблему с помощью таймера - это выглядит нормально ? Я бы предпочел, чтобы он был скрыт, хотя в настоящее время там есть текстовое поле с мигающим курсором

Private Sub rfidbox_textchanged(sender As System.Object, e As System.EventArgs) Handles rfidbox.TextChanged

        Timer1.Stop()
        Timer1.Start()

End Sub


событие Tick

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick

    Timer1.Stop()
    cardnumber = rfidbox.Text.ToString

    Dim name As String
    Dim x As New signclass

    If rfidbox.Text = "" Then

    Else
        name = x.getnamefromcard(rfidbox.Text.ToString)


        MsgBox(name)

        rfidbox.Text = ""

    End If


Dave Kreskowiak

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

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

Если нет, то у вас есть проблема. Клавиатурные клиновые устройства могут быть немного привередливыми. Когда код" набирается " читателем, что делать, если появится системный диалог? Часть кода идет в диалоговое окно, а не в текстовое поле. Единственный способ достоверно сказать: "это весь номер" - нажать кнопку.

Невидимое текстовое поле не получает фокуса, поэтому оно также не получает никакого ввода с клавиатуры. Кроме того, что делать, если считыватель не сможет прочитать карту? Как еще вы собираетесь получить идентификационный номер?

Если вы можете делать коды до и после исправления, это становится немного сложнее, но гораздо надежнее. Используя Form. KeyPreview, вы можете искать префиксный код, захватывать нажатия клавиш для кода, пока не увидите постфиксные коды.

caffrey_1

Кард-ридер тупой, он действует точно так же, как клавиатура, и бросает код в любое окно \ элемент управления, находящийся в фокусе. Мне не нужно беспокоиться о системных диалогах и других вещах, так как это автономное приложение
(Это система входа) таким образом, на главном экране есть в основном кнопки входа и выхода. Для удобства я планировал добавить функции чтения карт в основную форму.
У меня есть достаточно надежная работа с приведенным выше кодом, так как он возвращает правильное имя, извлеченное из поля LDAP, но мне не нравится, что текстовое поле видно (я уменьшил его до размера 1x1 пикселя, но оно все равно мигает само по себе!)

Начинаю думать, что это плохая идея для того времени, которое она экономит конечному пользователю, поэтому могу просто отказаться от нее

Рейтинг:
0

caffrey_1

Думаю, я исправил это с помощью вашего указателя (USB-считыватель входит после ввода)

Private Sub rfidinput_keypress(sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles rfidinput.KeyPress

    If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then

        Dim name As String
        Dim x As New signclass

        If rfidinput.Text = "" Then

        Else

            name = x.getnamefromcard(rfidinput.Text.ToString)

            MsgBox(name)

            rfidinput.Text = ""

        End If

    End If


End Sub


Я поддерживаю фокус на текстовом поле, перефокусируясь при нажатии других элементов