Improve Barcode search in a Textbox C#

2020-04-18 06:11发布

问题:

In a WinForm C# application I have a Barcode_textbox. In TextChanged event I have an SQL query to check for the TextBox.Text value in the database which is the barcode. The problem is that for each entered digit the SQL Query will be fired, so if a barcode of length 13 it will make 13 check in the database and it is being extremely SLOW.

So, what is the TextBox event that is fired only when the user stops writing in the TextBox (or the barcode reader stpos reading), or what is the optimal solution for checking for a barcode in the database. Note that bacode is of different length

回答1:

I recall how I did this with success.

I put Timer control in my application with a Interval of a second (1000 milli's). Then I set the Form.KeyPreview property to True.

In the Form Key Press event I store the key strokes. In the Timer.Tick event check if the length of the recorded key strokes exceeds 12 or so characters.

Then fire off the call to SQL, once. When you return a record successfully (or if the textbox contains greater than say 20 chars) clear the stored key strokes.


See update, as at March 2019: https://stackoverflow.com/a/55411255/495455



回答2:

Use timer in this fashion that when user stops typing in your textbox for a given small time say 1 second only then get data from database...

Also you can place a check at the characters typed by user with a counter such that when it exceeds that minimum(the minimum size that your key can be) get the data...Will save much time



回答3:

Timers are a horrible solution to this.

Use the KeyUp event of the TextBox and check for a carriage return. Most barcode scanners submit a carriage return after the code.. and if they don't do it by default, they come with barcodes to configure it to do so.

You can test this by opening Notepad and scanning barcode after barcode into it. Each one will be on a new line.



回答4:

You could use the Validating event to check the content of the TextBox.
Your user will be required to press the TAB key to change the current focus from the TextBox to the next control following the taborder and the validating event will be triggered

private void textBox_BarCode_Validating(object sender, CancelEventArgs e)
{
     // Code to check the barcode on the SQL database....       
     if(!ValidBarCode(textBox1.Text))
     {
           // Cancel the event and select the text to be corrected by the user.
           e.Cancel = true;
           textBox1.Select(0, textBox1.Text.Length);
     }

}

Suppose that the next control is the command that executes something using the Barcode inserted (Add)(or a textBox to insert the quantity of the item described by the barcode). After a while all the operation becomes a very natural data entry processing



回答5:

What about doing the query async?

If you can't or want an easy dirty solution, then I would just stick to the timer