根据条形码扫描仪扫描的条形码编号填充 DataGridView

Filling DataGridView based on a scanned barcode number from a barcode scanner

我阅读了大量的问题和答案,甚至阅读了 .NET 参考站点。代码看起来不错,但没有按预期工作。

我有一个 TextBox,其中使用条形码扫描仪扫描条形码并将数字放入其中。收到条形码后,它必须检测 Enter 键并执行搜索数据库并将项目添加到 DataGridView 中的功能。

代码有效,但即使我扫描多个项目,它也只会向 DataGridView 添加 1 个项目。

代码:

 Private Sub txtmodel_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtmodel.KeyPress

    Dim purchasesource As New BindingSource
    If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then


        Dim query As String
        query = "select  prod_name as 'Product Name',prod_cost as 'Cost', prod_price as 'Price' from  product_tbl where prod_STATUS = 'Active' and prod_code = '" & txtmodel.Text & "'"

        cmd = New MySqlCommand(query, con)
        da.SelectCommand = cmd
        da.Fill(sql_get_purchase_item)
        purchasesource.DataSource = sql_get_purchase_item
        DataGridView1.DataSource = purchasesource
        da.Update(sql_get_purchase_item)

        MsgBox(sql_get_purchase_item.Rows.Count)

        barcode = txtmodel.Text 'decaled in the class

        TextBox1.Text &= barcode

        txtmodel.Focus()

        txtmodel.SelectAll()

    End If

End Sub

搜索扫描的文本在数据库中是否可用,并将该行添加到 DataGridView

试试下面的代码:

Private Sub txtmodel_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtmodel.KeyPress

    Dim purchasesource As New BindingSource
    If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then

        Dim query As String
        query = "select  prod_name as 'Product Name',prod_cost as 'Cost', prod_price as 'Price' from  product_tbl where prod_STATUS = 'Active' and prod_code = '" & txtmodel.Text & "'"

        cmd = New MySqlCommand(query, con)
        da.SelectCommand = cmd
        da.Fill(sql_get_purchase_item)
        If sql_get_purchase_item.tables(0).rows.count > 0
            For Each row As DataRow In sql_get_purchase_item.Rows
                DataGridView1.rows.add(row.Item("Product Name"),row.Item("Cost"),row.Item("Price"))
            Next row

        End If
        purchasesource.DataSource = sql_get_purchase_item
        da.Update(sql_get_purchase_item)

        txtmodel.Focus()

        txtmodel.SelectAll()

    End If
End Sub

根据您的代码,txtModel 会在扫描时获得一个产品代码。按 Enter 后,您可以扫描 product_tbl 查找特定产品代码并将其显示在 DataGridView 中。如果我的逻辑是正确的,它将始终只显示最后扫描的产品。那是因为你的代码是这么说的。

您必须将每个产品添加到 DataGridView,而不是将查询结果(始终是一个产品)分配给 DataSource DataGridView.

@Praba 已经提供了合适的代码。

编辑添加和评论:

  Private Sub txtmodel_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtmodel.KeyPress

  Dim purchasesource As New BindingSource
  If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then

    Dim query As String
    ' Add break point on the below line.
    ' Check the value of txtModel here.
    query = "select  prod_name as 'Product Name',prod_cost as 'Cost', prod_price as 'Price' from  product_tbl where prod_STATUS = 'Active' and prod_code = '" & txtmodel.Text & "'"

    ' Add a break point on the below line.
    ' Check the value of query variable, copy it and execute it query analyser to check the result.
    cmd = New MySqlCommand(query, con)
    da.SelectCommand = cmd
    da.Fill(sql_get_purchase_item)

    ' Commented as not required.
    ' purchasesource.DataSource = sql_get_purchase_item
    ' DataGridView1.DataSource = purchasesource
    ' da.Update(sql_get_purchase_item)


    If sql_get_purchase_item.tables(0).rows.count > 0
      ' For each is not really required as you should always get only 1 product as a result.
      For Each row As DataRow In sql_get_purchase_item.Rows
        ' Add a break point on the below line.
        ' Check the values of each column returning.
        DataGridView1.rows.add(row.Item("Product Name"),row.Item("Cost"),row.Item("Price"))
      Next row
    End If

    ' Commented as not required.
    ' MsgBox(sql_get_purchase_item.Rows.Count)

    ' Comment if not required.
    barcode = txtmodel.Text 'decaled in the class

    ' Modified for better view
    TextBox1.Text &= barcode

    ' Commented as not required.
    'txtmodel.Focus()
    'txtmodel.SelectAll()

  End If

End Sub