检查列表框中的项目 - 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)。您也可以添加代码来处理此问题,并可能使您的用户更轻松、更快速地进行重复扫描。
我想做的是先检查列表框中的项目,如果文本框中的值已经在列表框中。
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)。您也可以添加代码来处理此问题,并可能使您的用户更轻松、更快速地进行重复扫描。