Сканирование штрих-кода в список проверки на наличие дубликатов - PullRequest
0 голосов
/ 10 мая 2018

Добрый день!

Я хочу добавить несколько строк из сканера штрих-кода, захваченных в текстовом поле, в список и, прежде чем добавить его, проверить, не была ли указанная строкауже добавлено.Поэтому у меня есть текстовое поле с именем txtWO, которое фиксирует то, что сканирует читатель, и список со списком с именем lstScanBOM, в который я добавляю строку текстового поля, если элемент еще не добавлен.Проблема в том, что, что бы я ни делал, только после того, как дважды добавлена ​​конкретная строка, проверка на повторяющиеся записи начинает работать.Другими словами, я сканирую одну и ту же строку дважды, она добавляется, а затем, когда я сканирую в третий раз, выдает только сообщение с ошибкой о том, что это дубликат.Я не понимаю, почему это делает.Код ниже: enter image description here

Private Sub frmValidareFIP_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If txtWO.Focused = False Then
        txtWO.Select()
    End If
End Sub
Private Sub AddUnique(StringToAdd As String)
    If lstScanBom.Items.Contains(StringToAdd) = True Then
        MsgBox("Articol duplicat!", vbOKOnly)
    Else
        'it does not exist, so add it..
        lstScanBom.Items.Add(StringToAdd)
    End If
End Sub
Private Sub txtWO_KeyDown(ByVal sender As Object,ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtWO.KeyDown
    If e.KeyCode = Keys.Enter Then
        Dim barcode As String
        barcode = txtWO.Text
        AddUnique(barcode)
        txtWO.Clear()
        txtWO.Focus()
    End If
End Sub

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Ваш считыватель штрих-кодов возвращаетсякак войти.Ваш код ловит клавишу ввода (возврат каретки = 13), но оставляет символ перевода строки (10).Так что в следующий раз, когда вы сканируете что-то, оно будет начинаться с перевода строки.Две строки в вашем примере отличаются, потому что первая - «58335001», а вторая - «58335001 ". Третий"58335001 ", что является дубликатом второго.

Один из способов исправить это - обрезать строку.

Private Sub txtWO_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtWO.KeyDown
    If e.KeyCode = Keys.Enter Then
        Dim barcode As String
        'Add the .Trim() to remove the leading <line feed> character
        barcode = txtWO.Text.Trim()
        AddUnique(barcode)
        txtWO.Clear()
        txtWO.Focus()
    End If
End Sub
0 голосов
/ 08 февраля 2019

Самое простое решение - сделать ТОЛЬКО элемент управления textBox txtWO НЕ многострочным И этого достаточно!Ваш код будет работать правильно!

0 голосов
/ 10 мая 2018

IMO Попробуйте вывести данные за пределы ListBox.Я не могу понять, почему он не работает, может быть, нам нужна третья пара глаз, чтобы увидеть его!пользователь сканирует и проверяет дубликат там ..

Это определенно не лучшее решение, но я уверен, что оно поможет!

Private List_Barcodes As List(Of String)
Private Sub frmValidareFIP_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    List_Barcodes = New List(Of String)
    'You can also populate this list on load, if you have a stored cahce of previous scanned barcodes?
    'List_Barcodes.Add("0123456")
    'List_Barcodes.Add("4567890")
    '...etc

    If txtWO.Focused = False Then
        txtWO.Select()
    End If
End Sub
Private Sub AddUnique(StringToAdd As String)
    If List_Barcodes.Contains(StringToAdd) Then
        MsgBox("Articol duplicat!", vbOKOnly)
    Else
        'Place into dynamic list
        List_Barcodes.Add(StringToAdd)
        'and Place into your listbox
        lstScanBom.Items.Add(StringToAdd)
    End If

End Sub
Private Sub txtWO_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtWO.KeyDown
    If e.KeyCode = Keys.Enter Then
        Dim barcode As String
        barcode = txtWO.Text
        AddUnique(barcode)
        txtWO.Clear()
        txtWO.Focus()
    End If
End Sub
...