2010-05-24 28 views
11

Tôi đang sử dụng Máy quét (kiểu máy cơ bản) để quét mã vạch. Mã vạch được quét sẽ được ghi lại trong một hộp văn bản. Trong txtBarcode_TextThay đổi sự kiện tôi nhận được mã vạch để truy cập.Giá trị quét (sử dụng máy quét) trong hộp văn bản

Sự cố:

Nếu tôi nhấp vào máy quét nhiều lần, mã vạch sẽ nối thêm với giá trị trước đó.

Code:

protected void txtBarcode_TextChanged(object sender, EventArgs e) 
    { 
     string txt = this.txtBarcode.Text; 
     this.txtBarcode.Text = string.Empty; 
    } 
+2

Đây là câu hỏi hoàn toàn hợp lệ, có lẽ tiếng Anh không hoàn hảo, nhưng điều anh ấy muốn là rõ ràng. – Kazar

Trả lời

8

Điều với máy quét mã vạch là chúng thường xuất hiện giống như bàn phím HID tiêu chuẩn. Do đó, mỗi mã mới được quét có hiệu quả là 'đã gõ' sau phiên bản trước đó. Một giải pháp tôi đã sử dụng trong quá khứ là để xem có bao nhiêu thời gian trôi qua giữa các lần nhấn phím trong hộp văn bản đó. Nếu nó dài hơn 10 mili giây (hoặc xung quanh giá trị đó, tôi tin rằng đây là khoảng thời gian lớn nhất cho máy quét mà tôi đang sử dụng để 'nhập' toàn bộ mã), thì đó là mã vạch mới và bạn nên xóa mọi thứ trước nó .

tôi đã không có một IDE để tay, vì vậy hầu hết các lớp/tên phương pháp có lẽ là con đường tắt, nhưng cái gì đó như một ví dụ:

DateTime lastKeyPress = DateTime.Now; 

void txtBarcode_KeyPress(object sender, KeyPressEventArgs args) 
{ 

    if(((TimeSpan) (DateTime.Now - lastKeyPress)).TotalMilliseconds > 10) 
    { 
    txtBarcode.Text = "";  
    } 
    lastKeyPress = DateTime.Now; 
} 

Tôi nghĩ rằng nên làm điều đó. Nó hoạt động vì sự kiện KeyPress xảy ra trước khi ký tự được nối thêm, vì vậy bạn có thể xóa hộp văn bản trước tiên.

Chỉnh sửa: Để thiết lập, tôi đoán rằng bất cứ nơi nào bạn có txtBarcode.TextChanged += txtBarcode_TextChanged, thay vào đó bạn có một txtBarcode.KeyPress += txtBarcode_KeyPress. Kiểm tra tên sự kiện là đúng mặc dù.

Chỉnh sửa 2:


jQuery Version:

Giả HTML này (kể từ khi bạn đang sử dụng ASP, nguồn của bạn cho thẻ đầu vào sẽ trông khác, nhưng sản lượng sẽ vẫn có id thuộc tính, mà thực sự là thuộc tính duy nhất quan trọng):

<form action="" method="post"> 
     <input type="text" name="txtBarcode" id="txtBarcode" /> 
    </form> 

Sau đó javascript này hoạt động:

$(document).ready(function() { 

    var timestamp = new Date().getTime(); 

    $("#txtBarcode").keypress(function(event) 
    { 
     var currentTimestamp = new Date().getTime(); 

     if(currentTimestamp - timestamp > 50) 
     { 
      $(this).val(""); 
     } 
     timestamp = currentTimestamp; 
    });         

}); 

Dường như (ít nhất là trong trình duyệt web) 50 mili giây là thời gian cần thiết để cho phép giữa các ký tự. Tôi đã thử nghiệm điều này trong Firefox, Chrome và IE7.

+0

Tôi đã thêm nó vào câu trả lời, xem Chỉnh sửa. – Kazar

+0

Trên thực tế, điều này có cần phải xử lý sự kiện một sự kiện trên đầu vào văn bản trên một trang web không? Mã khác hoàn toàn nếu có. – Kazar

+0

Bạn có mã cho javascript/jquery không? – Geeth

-1

Nếu bạn đang gán txtBarcode.value += barcode, thay đổi nó để txtBarcode.value = barcode

+0

-1: Anh ấy sử dụng máy quét mã vạch. Anh ta không thêm văn bản trong mã của mình. – Mahmoodvcs

2

cố gắng để thay đổi xử lý sự kiện TextChanged đến loại này:

txtBarcode.SelectionStart = 0; 
txtBarcode.SelectionLength = txtBarcode.Text.Length; 


Nó sẽ chọn văn bản trong hộp văn bản sau khi đọc mã và viết lại nó trên đọc khác. + nó sẽ phù hợp hơn cho người dùng sao chép hoặc thay đổi bằng tay

+0

Bạn có đang sử dụng lớp .NET TextBox không? Nếu vậy, phải có SelectionStart, SelectionLength. Tôi sử dụng mã này bản thân mình khi đã làm việc với barcodereader và muốn viết lại mã vạch đọc trước đó. – 0x49D1

+0

Geeth

+0

oops..i nghĩ bạn có winforms (bỏ qua các thẻ về javascript). Sau đó, có lẽ điều này sẽ giúp và làm tương tự tôi đã làm trong winforms: http://bytes.com/topic/asp-net/answers/288734-selecting-all-text-textbox – 0x49D1

2

Hầu hết các máy quét có thể được lập trình để "nhấn enter" sau khi quét, kiểm tra hướng dẫn sử dụng của bạn. Bạn có thể sử dụng trình xử lý sự kiện Keypress hoặc Keydown để kiểm tra phím "enter" và sử dụng nó làm dấu tách cho mã vạch của bạn.Bạn cũng có thể sử dụng một ký tự phân cách đặc biệt nếu bạn muốn.

private void txtScan_KeyDown(object sender, KeyRoutedEventArgs e) 
     { 
      if (e.Key == Windows.System.VirtualKey.Enter) 
      { 
       //Do something here... 

       txtScan.Text = ""; 
       txtScan.Focus(FocusState.Programmatic); 
       e.Handled = true; //keeps event from bubbling to next handler 
      } 
     } 
Các vấn đề liên quan