2010-05-24 24 views
11

Estoy usando Escáner (modelo básico) para escanear el código de barras. El código de barras escaneado se capturará en un cuadro de texto. En el evento txtBarcode_TextChanged estoy obteniendo el código de barras para acceder.Valor escaneado (usando escáner) en el cuadro de texto

Problema:

Si chasqué el escáner más de una vez, el código de barras se anexe con el valor anterior.

Código:

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

Esta es una pregunta perfectamente válida, tal vez el inglés no es perfecto, pero lo que él quiere es claro. – Kazar

Respuesta

8

Lo que ocurre con los escáneres de códigos de barras es que generalmente se presentan como un teclado HID estándar. Por lo tanto, cada nuevo código escaneado se 'tipea' efectivamente después del anterior. Una solución que he usado en el pasado es ver cuánto tiempo pasa entre las pulsaciones de teclas en ese cuadro de texto. Si es más de 10 milisegundos (o alrededor de ese valor, creo que esta fue la mayor cantidad de tiempo que le tomó al escáner que estaba usando para 'escribir' un código completo), entonces es un código de barras nuevo, y debe eliminar todo antes .

no tengo un IDE a mano, por lo que la mayor parte de los nombres de clase/método son probablemente muy lejos, pero algo así como un ejemplo:

DateTime lastKeyPress = DateTime.Now; 

void txtBarcode_KeyPress(object sender, KeyPressEventArgs args) 
{ 

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

creo que debería hacerlo. Funciona porque el evento KeyPress ocurre antes de que el carácter se anexe, por lo que puede borrar primero el cuadro de texto.

Editar: Para configurar, supongo que donde quiera que tiene txtBarcode.TextChanged += txtBarcode_TextChanged, que en cambio tienen un txtBarcode.KeyPress += txtBarcode_KeyPress. Verifique que el nombre del evento sea correcto.

Editar 2:


jQuery Versión:

Asumiendo este código HTML (dado que está utilizando ASP, su fuente para la etiqueta de entrada será diferente, pero la salida todavía tendrá la id atributo, que es realmente la única que importa):

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

Entonces este javascript funciona:

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

}); 

Parece que (al menos en un navegador web) 50 milisegundos es el tiempo necesario para permitir que entre los caracteres. He probado esto en Firefox, Chrome e IE7.

+0

Lo he agregado a la respuesta, vea el Editar. – Kazar

+0

En realidad, ¿tiene que ser esto necesario manejar un evento en una entrada de texto en una página web? Código diferente por completo si es así. – Kazar

+0

¿Tiene código para javascript/jquery? – Geeth

-1

Si está asignando txtBarcode.value += barcode, cambiarlo a txtBarcode.value = barcode

+0

-1: Utiliza un escáner de código de barras. Él no está agregando el texto en su código. – Mahmoodvcs

2

intenta cambiar controlador de eventos TextChanged a este tipo de:

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


Se seleccionará texto en el cuadro de texto después de leer el código y reescribirlo en otra lectura. + será más adecuado para los usuarios copiarlo o cambiarlo a mano

+0

¿Está utilizando la clase .NET TextBox? Si es así, debe haber SelectionStart, SelectionLength. Usé este código yo mismo cuando estaba trabajando con lector de códigos de barras y quería reescribir el código de barras leído previamente. – 0x49D1

+0

Geeth

+0

oops..i pensaste que tienes winforms (perdiste las etiquetas sobre javascript). Entonces quizás esto ayude y haga lo mismo que hice en winforms: http://bytes.com/topic/asp-net/answers/288734-selecting-all-text-textbox – 0x49D1

2

La mayoría de los escáneres se pueden programar para "presionar enter" después de escanear, consulte el manual del usuario. Puede usar un manejador de eventos Keypress o Keydown para verificar la tecla "enter" y usarla como delimitador para su código de barras.También puede usar un carácter delimitador especial si lo prefiere.

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 
      } 
     } 
Cuestiones relacionadas