检查列表框中的项目 - vb.net

check the item in listbox - vb.net

我想做的是先检查列表框中的项目,如果文本框中的值已经在列表框中。

 Private Sub txtSS_PreviewKeydown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles txtSS.PreviewKeyDown

    If e.KeyCode = Keys.Tab Then

        For Each a As String In String.Join(vbCrLf, ListBox1.Items.Cast(Of String))
            If txtSS.Text = a Then
                MsgBox("It's already barcoded!")
                txtSS.Text = ""
            End If
        Next

        If txtMS.Text = txtSS.Text Then
            MsgBox("This is already MAIN SERIAL! kindly check your barcoding serial", MsgBoxStyle.Exclamation)
            txtSS.Text = ""
            txtSS.Select()
        Else
            ListBox1.Items.Add(txtSS.Text)
            txtSS.Clear()
            txtSS.Select()
        End If
    End If

End Sub

但是我的代码不起作用。

我的每个值的 'a' 只获取列表框的第一个字符。

txtSS.Text = "一个" 在您的编辑器中将选项 strict 设置为 on 以查看代码中的错误

想想这个表达式,与 For Each 循环一起使用:

String.Join(vbCrLf, ListBox1.Items.Cast(Of String))

表达式的结果是一个字符串。当您使用带有 For Each 循环的字符串时,它不会逐行进行。相反,如您所见,循环 运行 用于字符串中的每个字符,一次 一个字符 。如果你想要ListBox中的每一项,你根本不需要使用Join()

For Each a As String In ListBox1.Items.Cast(Of String)()

或者我可以重构整个方法,使其更短且嵌套更少:

Private Sub txtSS_PreviewKeydown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles txtSS.PreviewKeyDown

    If e.KeyCode <> Keys.Tab Then Exit Sub

    If ListBox1.Items.Any(Function(a) txtSS.Text = DirectCast(a, String)) Then
        MsgBox("It's already barcoded!")
    Else If txtMS.Text = txtSS.Text Then
        MsgBox("This is already MAIN SERIAL! Kindly check your barcoding serial.", MsgBoxStyle.Exclamation)
    Else 
        ListBox1.Items.Add(txtSS.Text)
    End If

    txtSS.Clear()
    txtSS.Select()
End Sub

这还修复了原始代码中的另一个错误,即“它已经编好条形码!”结果没有退出方法。下一个 If 检查仍然会有 运行,其中空字符串不太可能匹配主序列号,因此该方法仍然可能会在列表框的底部添加一个空行。这将不再发生。


当我在这里时,我看到您正在查看 Tab 键并使用条形码。默认情况下,大多数条形码阅读器会在扫描的文本末尾发送一个 return 键 (Cr/Lf)。您也可以添加代码来处理此问题,并可能使您的用户更轻松、更快速地进行重复扫描。