如何在不使用TextChanged事件的情况下在Winform上捕获整个条形码值?

时间:2019-03-29 05:04:06

标签: c# winforms barcode

当在form1上扫描条形码时,我调用数据库以获取该条形码的项目,然后使用预先填充的数据打开form2。

如果我使用文本更改事件,则它的生成次数与一个条形码中的数字相同。

我无法检查条形码的长度,因为每次条形码的长度可能不同。

扫描条形码时,我应该使用哪个事件只打一个电话?

我尝试了TextChanged,KeyPress,KeyDown事件,但是它们都被多次调用了。

    private void txt_Barcode_TextChanged(object sender, EventArgs e)
    {
        con.Open();
        GenerateInvoice gn = new GenerateInvoice();
        string query = "SELECT * FROM dbo.Inventory WHERE Barcode = '" + txt_Barcode.Text + "' ";

        SqlCommand cmd = new SqlCommand(query, con);
        SqlDataReader dr = cmd.ExecuteReader();


        while (DR1.Read())
        {
            gn.txt_Barcode.Text = dr["Barcode"].ToString();
            gn.txt_ProductName.Text = dr["ProductName"].ToString();
            gn.txt_Price.Text = dr["SellingPrice"].ToString();
            gn.txt_QTY.Text = 1.ToString();
            gn.txt_Total.Text = dr["SellingPrice"].ToString();

        }
        con.Close();
    }

我愿意使用文本框捕获Form1上的条形码(我将其隐藏在UI中)

3 个答案:

答案 0 :(得分:5)

这是扫描仪处于WedgeMode的结果。基本上,它充当键盘,并且扫描的每个字符都会创建一个文本更改事件。

有很多解决方法。

您可以使用购买扫描仪的公司提供的api代替楔模式

但是,一个简单的解决方法是在扫描仪上放置前缀和后缀(例如ascii代码STXETX)(通常由扫描仪提供此设置)有完整的条形码数据时知道的方式。

当您看到有效的条形码时,您将发生一个事件,而不是每个扫描字符的事件。

答案 1 :(得分:2)

您可能会看到有关此主题的一些答案。

Improve Barcode search in a Textbox C#

distinguish between the scanner and the keyboard

Barcode scanner with a WPF application

如果我要再做一次并且很久以前是第一次,我会选择RawInput的设备,并确定哪个设备是条形码扫描仪。

使用前缀和后缀是可靠的,尽管它们会因设备而异。 捕获原始输入将抽象该硬件实现。 

代码项目文章和下载:Using Raw Input from C# to handle multiple keyboards

看看如何从任何来源获取输入,这样我什至不需要用户将光标放在文本框上或使用Form.KeyPreview就能按设备过滤输入。

enter image description here

enter image description here

enter image description here

答案 2 :(得分:0)

您可以尝试让事件等待1秒或足够长的时间以完成扫描

private async void txt_Barcode_TextChanged(object sender, EventArgs e)
{
    await Task.Delay(1000);
    con.Open();
    GenerateInvoice gn = new GenerateInvoice();
    string query = "SELECT * FROM dbo.Inventory WHERE Barcode = '" + txt_Barcode.Text + "' ";

    SqlCommand cmd = new SqlCommand(query, con);
    SqlDataReader dr = cmd.ExecuteReader();


    while (DR1.Read())
    {
        gn.txt_Barcode.Text = dr["Barcode"].ToString();
        gn.txt_ProductName.Text = dr["ProductName"].ToString();
        gn.txt_Price.Text = dr["SellingPrice"].ToString();
        gn.txt_QTY.Text = 1.ToString();
        gn.txt_Total.Text = dr["SellingPrice"].ToString();

    }
    con.Close();
}