Hỏi về cách xử lý mã barcode hiển thị dữ liệu lên Datagridview trong winform


-Em muốn mỗi lần quét mã thẻ từ máy quét thì sẽ tự động so sánh MaThe có trong csdl và từ đó hiện thị các thông tin còn lại lên datagridview cứ như vậy sau mỗi lần mình quét
Đoạn code em đang thực hiện
Em sử dụng sự kiên TextChanged trong textbox để sử lý mã thẻ khi quét được, khi xử lý mã thẻ sau đó sẽ thực hiện truy vấn lấy các thông tin từ bảng TheBai sau đó cập nhật lên datagridview, hiện tại là e gặp vấn đề là chưa hiển thị lên được sau khi quét mã thẻ, nhờ mọi người chỉ ra cái sai và có cách nào làm tối ưu hơn hay có đường dẫn tham khảo cách làm càng tốt ạ
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace CardScannerApp
{
public partial class MainForm : Form
{
private SqlConnection connection;

   public FrmHT()
    {
        InitializeComponent();
            string connectionString = "Data Source=DESKTOP-VAUF8MI\\SQLEXPRESS;Initial Catalog=TFEBC;User ID=sa;Password=tfe@123";
            //sqlConnection = new SqlConnection(connectionString);
            //sqlConnection.Open();
            connection = new SqlConnection(connectionString);
            connection.Open();
            txtBarcodeDisplay.TextChanged += txtBarcodeDisplay_TextChanged;
        //txtBarcodeDisplay.TextChanged += txtBarcodeDisplay_TextChanged;
        //LoadSoHDComboBox();


    }

   private void displayCardinfo(string maThe)
    {
        string query = $"SELECT SoHD, MaHang, Size, Color FROM TheBai WHERE MaThe = @MaThe";
        SqlCommand command = new SqlCommand(query, connection);
        command.Parameters.AddWithValue("@MaThe", maThe);

        SqlDataAdapter adapter = new SqlDataAdapter(command);
        DataTable dataTable = new DataTable();
        adapter.Fill(dataTable);

        dataGridView1.DataSource = dataTable;


    }

    private void txtBarcodeDisplay_TextChanged(object sender, KeyEventArgs e)
    {
        
        string maTheQuet = txtBarcodeDisplay.Text.Trim();
        displayCardinfo(maTheQuet);
       
    }
}

}

  1. Có thể loại scanner bạn dùng là dạng HID,
    Khi scan 1 barcode, nó gửi 1 loạt message về windows giống như nhập dãy số đó bằng bàn phím vào và ENTER
    Trường hợp này bạn cần focus vào textbox thì khi scan mới nhập mã vào textbox được

  2. là do bạn bắt event tại TextChanged. Khi scanner mới input được 1 ký tự đầu tiên, event TextChange đc thưc thi và treo UI, do việc gọi xuống db chưa xử lý xong.
    Lúc này dãy ký tự từ scanner nhập xong rồi, event của bạn cho ký tự đầu tiên chưa xử lý xong nên các ký tự sau bị bỏ qua

  3. thay vào đó, hãy xử lý trong event keydown

private void txtBarcodeDisplay_KeyDown(object sender, KeyEventArgs e)
{
      if (e.KeyCode == Keys.Enter)
      {
          string barcode = textBox1.Text;
          displayCardinfo(string maThe);
          txtBarcodeDisplay.Clear();
       }
 }
1 Like

Do lâu quá không ai rep nên em k vào lại giờ thấy mới chỉnh sửa theo cách của bác và đã thành công , thank bác nhiều ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?