2010-07-26 17 views
6

Estoy intentando establecer una máscara hexadecimal para un cuadro de texto. Para que solo se puedan ingresar números hexadecimales válidos. (Y ',' y 'ENTER')C# Hex Mask para entrada de cuadro de texto enmascarado

Casi funciona. Hasta ahora, solo permitirá letras pequeñas de a-f y números 0-9, pero aún puedo ingresar letras mayúsculas GHIJKLM. (Al principio, cuando se inicia el programa, parece aceptar un char exk, pero después de haberlo excluido una vez que no se mostrará después de eso, hasta la próxima vez que inicie el programa. Eso es extraño.)

Aquí hay una parte del código:

private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    // if keychar == 13 is the same as check for if <ENTER> was pressed 
    if (e.KeyChar == (char)13) 
    { 
     // is <ENTER> pressed, send button_click 
     button1_Click(sender, e); 
    } 
    { 
     // this will only allow valid hex values [0-9][a-f][A-F] to be entered. See ASCII table 
     char c = e.KeyChar; 
     if (c != '\b' && !((c <= 0x66 && c >= 61) || (c <= 0x46 && c >= 0x41) || (c >= 0x30 && c <= 0x39) || (c == 0x2c))) 
     { 
      e.Handled = true; 
     } 
    } 
} 

Así es como me ato el evento:

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    this.textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyDown); 
} 

podría alguien de ustedes sabios, ver lo que estoy haciendo mal?

Es mi primer programa pequeño, por lo que ir fácil en mí: o)

+0

La parte sobre la primera pulsación de tecla no tiene mucho sentido. ¿Cómo se vincula el evento? ¿Intentó utilizar el evento 'KeyDown'? – Kobi

+0

hice esto desde el cuadro de entrada: privada vacío TextBox1_TextChanged (object sender, EventArgs e) { this.textBox1.KeyPress + = new System.Windows.Forms.KeyPressEventHandler (textBox1_KeyDown); } – user302935

Respuesta

7

Este:

c <= 0x66 && c >= 61 

debe ser:

c <= 0x66 && c >= 0x61 //hex literal 

Tenga en cuenta que usted está perdiendo tiempo valioso buscando códigos hexadecimales, puede comparar fácilmente los caracteres:

if ((c >= 'a') && (c <= 'f')) 

En cuanto al primer carácter: no debe vincular el KeyPress en el evento TextChanged - ¡ya es demasiado tarde! Aquí está la secuencia de eventos:

  1. carga el formulario
  2. ...
  3. usuario haga clic en una tecla.
  4. TextChanged se activó, cambiando el texto y vinculando el evento.
  5. Usuario haga clic en una tecla.
  6. KeyPress activado.

Lo que quieres hacer es vincular el evento desde el principio. El mejor lugar es el evento .
También puede usar la ventana Propiedades para vincular el evento en el momento del diseño

+0

Genial. Ahora funciona perfectamente. Gracias por la ayuda – user302935

+0

Más elegante. Pero podrías simplificarlo para noobs. No es que lo necesite, sino para referencia futura. –

3

Si no hubiera utilizado números mágicos, nunca se habría encontrado con este problema. Vuelva a escribir su if así:

if (!(c == '\b' || ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') // et cetera 
0

Qué tipo de programa es éste un sitio web ASP.NET o algún tipo de winforms cliente/WPF gruesa? La razón por la que pregunto es por la posibilidad de que esté probando el código obsoleto. De lo contrario, el cambio puede ser simplemente voltear la lógica de verificación para estar más alineado con lo que desea. Asegurando que el personaje ingresado sea un elemento en el conjunto permitido. Una refactorización está abajo.

e.Handled = (c> = 0x61 & & c < = 0x66) || (c> = 0x41 & & c < = 0x46) || (c> = 0x30 & & c < = 0x39);

Como un enfoque alternativo si solo quiere validar todo el cuadro de texto a la vez en lugar de después de cada pulsación de tecla, puede analizar el valor para ver si se trata de un número. El siguiente fragmento de código generará el análisis del valor 11486525 de AF453d. Si el número no es un valor hexadecimal válido, el resultado de isHex será falso;

int i; 
string s = "AF453d"; 
bool isHex; 
isHex = int.TryParse(s, System.Globalization.NumberStyles.AllowHexSpecifier, null, out i); 
Console.WriteLine(isHex); 
Console.WriteLine(i); 
+0

El código dice 'System.Windows.Forms'. –

+0

Buen punto. Acabo de pasar por alto eso. – Tedford

2

utilizar una expresión regular:

using System.Text.RegularExpressions; 

... 

if (!(Regex.IsMatch(e.KeyChar.ToString(), "^[0-9a-fA-F]+$")) 
    e.Handled = true; 
+1

Honestamente, un Regex es demasiado para este problema, y ​​sugerirle una expresión regular a un nuevo programador es un delito de frontera ':)' – Kobi

+0

Esto parece una solución mucho mejor que la que tuve. Pero todavía tengo el problema al ingresar el primer carácter, después de que se inicia el programa. Parece aceptar casi cualquier cosa, pero solo el primer personaje. Pensé que el problema estaba en mi solución anterior debido a perder un tiempo valioso buscando códigos hexadecimales. Pero cuando uso la expresión regular también veo este problema. Alguna idea? – user302935

+0

Estoy casi seguro de que este problema no está relacionado con esta solución ... quizás necesitemos un poco más de información para ver qué está pasando. –

0

Por qué complicarlo?

private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e) 
    { 
     char c = e.KeyChar; 
     e.Handled = !System.Uri.IsHexDigit(e.KeyChar) && c != 0x2C; 
    } 
+0

no funciona. los números no son reconocidos –

0
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { 
    /* less than 0 or greater than 9, and 
    * less than a or greater than f, and 
    * less than A or greater than F, and 
    * not backspace, and 
    * not delete or decimal (which is the same key as delete). */ 
    if (
    ((e.KeyChar < 48) || (e.KeyChar > 57)) && 
    ((e.KeyChar < 65) || (e.KeyChar > 70)) && 
    ((e.KeyChar < 97) || (e.KeyChar > 102)) && 
    (e.KeyChar != (char)Keys.Back) && 
    ((e.KeyChar != (char)Keys.Delete) || (e.KeyChar == '.')) 
    ) e.Handled = true; 
} 
0

Sobre la base de la respuesta de Kobi para WPF

private void EnterKey(Object sender, KeyEventArgs e) 
    { 
     Key c = e.Key; 

     if (!((c >= Key.A) && (c <= Key.F))) 
     { 
      if (!((c >= Key.D0) && (c <= Key.D9))) 
      { 
       if (!((c >= Key.NumPad0) && (c <= Key.NumPad9))) 
       { 
        e.Handled = true; 
        LogText("Handled"); 
       } 
      } 
     } 
    } 

Captura letras, números y números del teclado.

Cuestiones relacionadas