2010-05-24 17 views
11

Używam skanera (model podstawowy) do skanowania kodu kreskowego. Zeskanowany kod kreskowy zostanie przechwycony w polu tekstowym. W zdarzeniu txtBarcode_TextChanged uzyskuję dostęp do kodu kreskowego.Zeskanowana wartość (przy użyciu skanera) w polu tekstowym

Problem:

Jeśli kliknąłem skaner więcej niż jeden raz, kod kreskowy zostanie dołączyć do poprzedniej wartości.

Kod:

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

To jest idealnie poprawne pytanie, być może angielski nie jest idealny, ale to, czego chce, jest jasne. – Kazar

Odpowiedz

8

Rzeczą w skanerach kodów kreskowych jest to, że zazwyczaj prezentują się one jak standardowa klawiatura HID. Dlatego każdy nowy skanowany kod jest skutecznie "wpisywany" po poprzednim. Rozwiązaniem, z którego korzystałem w przeszłości, jest sprawdzenie, ile czasu upływa między naciśnięciami klawiszy w tym polu tekstowym. Jeśli jest to więcej niż 10 milisekund (lub około tej wartości, uważam, że był to największa ilość czasu potrzebna na skaner, którego użyłem do "wpisania" całego kodu), to jest nowy kod kreskowy i powinieneś usunąć wszystko przed nim .

Nie mam IDE do strony, więc większość klasowych nazw/metody są prawdopodobnie daleko, ale coś takiego przykładu:

DateTime lastKeyPress = DateTime.Now; 

void txtBarcode_KeyPress(object sender, KeyPressEventArgs args) 
{ 

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

myślę, że powinien to zrobić. Działa, ponieważ zdarzenie KeyPress występuje przed dodaniem znaku, więc możesz najpierw wyczyścić pole tekstowe.

Edit: Aby skonfigurować, myślę, że wszędzie tam, gdzie masz txtBarcode.TextChanged += txtBarcode_TextChanged, zamiast tego mają txtBarcode.KeyPress += txtBarcode_KeyPress. Sprawdź jednak nazwę wydarzenia.

Edycja 2:


jQuery Wersja:

Zakładając ten HTML (ponieważ używasz ASP, źródło dla tagu wejściowego będzie wyglądać inaczej, ale wynik nadal będzie mieć id atrybut, który jest naprawdę jedynym, który się liczy):

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

Wtedy ten javascript działa:

$(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; 
    });         

}); 

Wygląda na to, że (przynajmniej w przeglądarce internetowej) 50 milisekund to czas wymagany do dopuszczenia między znakami. Przetestowałem to w Firefoksie, Chrome i IE7.

+0

Dodałem go do odpowiedzi, patrz Edycja. – Kazar

+0

W rzeczywistości, czy jQuery musi obsługiwać zdarzenie przy wprowadzaniu tekstu na stronie internetowej? Inny kod całkowicie, jeśli tak. – Kazar

+0

Czy masz kod dla javascript/jquery? – Geeth

-1

Jeśli przypisanie txtBarcode.value += barcode, zmień go na txtBarcode.value = barcode

+0

-1: Używa skanera kodów kreskowych. Nie dołącza tekstu do swojego kodu. – Mahmoodvcs

2

Spróbuj zmienić obsługi zdarzeń TextChanged do rodzaju to:

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


It wybierze tekst w polu tekstowym po przeczytaniu kodu i przepisaniu go na inny odczyt. + będzie bardziej odpowiednie dla użytkowników, aby je skopiować lub zmienić ręcznie

+0

Czy używasz klasy .NET TextBox? Jeśli tak, to musi być SelectionStart, SelectionLength. Użyłem tego kodu sam podczas pracy z barcodereader i chciałem przepisać wcześniej odczytany kod kreskowy. – 0x49D1

+0

Geeth

+0

oops..i pomyślałeś, że masz winformy (nieodebrane tagi o javascript). Może to pomoże i zrobi to samo w WinForm: http://bytes.com/topic/asp-net/answers/288734-selecting-all-text-textbox – 0x49D1

2

Większość skanerów można zaprogramować na "wciśnij enter" po zakończeniu skanowania, sprawdź instrukcję użytkownika. Możesz użyć funkcji obsługi zdarzenia Keypress lub Keydown, aby sprawdzić klawisz "Enter" i użyć go jako ogranicznika dla kodu kreskowego.Możesz także użyć specjalnego znaku ograniczającego, jeśli wolisz.

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 
      } 
     } 
Powiązane problemy