2010-05-24 15 views
11

Sto utilizzando Scanner (modello base) per eseguire la scansione del codice a barre. Il codice a barre scansionato verrà catturato in una casella di testo. Nell'evento txtBarcode_TextChanged sto ottenendo il codice a barre per accedere.Valore scansionato (tramite scanner) nella casella di testo

Problema:

Se ho cliccato lo scanner più di una volta, il codice a barre viene accoda con il valore precedente.

Codice:

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

Questa è una domanda perfettamente valida, forse l'inglese non è perfetto, ma quello che vuole è chiaro. – Kazar

risposta

8

La cosa con gli scanner di codici a barre è che di solito si presentano come una tastiera HID standard. Pertanto, ogni nuovo codice scansionato viene effettivamente 'digitato' dopo quello precedente. Una soluzione che ho usato in passato è vedere quanto tempo passa tra i tasti premuti in quella casella di testo. Se è più di 10 millisecondi (o attorno a quel valore, credo che questa sia stata la quantità di tempo più lunga per lo scanner che stavo usando per "digitare" un intero codice), quindi è un nuovo codice a barre, e dovresti eliminare tutto prima di esso .

non ho un IDE a portata di mano, quindi la maggior parte dei nomi di classe/metodo sono probabilmente lontano, ma qualcosa di simile un esempio:

DateTime lastKeyPress = DateTime.Now; 

void txtBarcode_KeyPress(object sender, KeyPressEventArgs args) 
{ 

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

penso che dovrebbe farlo. Funziona perché l'evento KeyPress si verifica prima che il personaggio venga aggiunto, quindi è possibile cancellare prima la casella di testo.

Modifica: Per impostare, immagino che ovunque ci sia txtBarcode.TextChanged += txtBarcode_TextChanged, voi invece avere un txtBarcode.KeyPress += txtBarcode_KeyPress. Controlla il nome dell'evento è giusto però.

Edit 2:


jQuery Versione:

Assumendo questo HTML (dal momento che si sta utilizzando ASP, la vostra fonte per il tag input avrà un aspetto diverso, ma l'uscita avrà ancora la id attributo, che in realtà è l'unico che conta):

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

Allora questo javascript funziona:

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

}); 

Sembra che (almeno in un browser Web) 50 millisecondi è il tempo necessario per consentire tra i caratteri. Ho provato questo in Firefox, Chrome e IE7.

+0

L'ho aggiunto alla risposta, vedi la Modifica. – Kazar

+0

In realtà, è necessario che jquery gestisca un evento su un input di testo in una pagina Web? Codice diverso interamente se così. – Kazar

+0

Hai il codice per javascript/jquery? – Geeth

-1

Se stai assegnando txtBarcode.value += barcode, modificarlo a txtBarcode.value = barcode

+0

-1: usa uno scanner di codici a barre. Non sta aggiungendo il testo nel suo codice. – Mahmoodvcs

2

cercare di cambiare gestore di eventi TextChanged per tipo di questo:

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


E ' selezionerà il testo nella casella di testo dopo aver letto il codice e lo riscriverà su altre letture. + sarà più adatto agli utenti per copiarlo o cambiarlo a mano

+0

Stai usando la classe .NET TextBox? Se è così, ci devono essere SelectionStart, SelectionLength. Ho usato questo codice da solo quando lavoravo con il barcodereader e volevo riscrivere il codice a barre precedentemente letto. – 0x49D1

+0

Geeth

+0

oops..ho pensato di avere winforms (mancati i tag su javascript). Allora forse questo aiuterà e farà lo stesso che ho fatto in winforms: http://bytes.com/topic/asp-net/answers/288734-selecting-all-text-textbox – 0x49D1

2

La maggior parte degli scanner può essere programmata su "premere Invio" dopo la scansione, controllare il manuale dell'utente. È possibile utilizzare un gestore di eventi Keypress o Keydown per controllare la chiave "invio" e utilizzarla come delimitatore per il codice a barre.Se preferisci, puoi anche usare un carattere di delimitazione speciale.

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 
      } 
     } 
Problemi correlati