Как захватить все значение штрих-кода на Winform без использования события TextChanged? - PullRequest
6 голосов
/ 29 марта 2019

Когда штрих-код сканируется в 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();
    }

Я открыт для использования текстового поля для захвата штрих-кода в форме 1 (я буду скрывать его в пользовательском интерфейсе)

Ответы [ 3 ]

5 голосов
/ 29 марта 2019

Это результат работы сканера в режиме WedgeMode. в основном он действует как клавиатура, и каждый отсканированный символ создает событие изменения текста.

Есть много решений.

Вы можете использовать API, предоставленный компанией, у которой вы купили сканер, вместо wedgemode

Тем не менее, простое решение состоит в том, чтобы поместить на сканер префикс и суффикс (например, коды ascii, STX и ETX) (обычно для этого есть параметры, предоставляемые сканером), чтобы вы знали, когда у вас есть полные данные штрих-кода.

Когда вы видите действительный штрих-код, вы делаете одно событие, а не событие для каждого сканируемого символа.

2 голосов
/ 29 марта 2019

Вы, вероятно, увидите несколько моих ответов по этой теме.

Улучшение поиска штрих-кода в текстовом поле C #

различают сканер иклавиатура

Сканер штрих-кода с приложением WPF

Если бы я должен был сделать это снова и первый раз был давно Я бы выбрал RawInput и определил, какое устройство является сканером BarCode.Использование префикса и суффикса надежно , хотя они различаются в зависимости от устройства . Захват необработанного ввода абстрагирует эту аппаратную реализацию.

Статья Code Project и загрузка: Использование необработанного ввода из C # для обработки нескольких клавиатур

Узнайте, какЯ могу получить ввод из любого источника, поэтому мне даже не нужно, чтобы пользователь помещал курсор в текстовое поле или использовал Form.KeyPreview. Я могу фильтровать ввод по устройству.

enter image description here

enter image description here

enter image description here

0 голосов
/ 29 марта 2019

Вы можете попытаться подождать, пока событие подождет 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();
}
...