Pregunta

Necesito poder bloquear los caracteres válidos en un cuadro de texto, actualmente tengo una expresión regular con la que puedo comparar cada carácter, como

  

[A-Za-z]

se bloquearía solo para caracteres alfa.

protected override void OnKeyPress(KeyPressEventArgs e)
{
  if (e.KeyChar == (char)Keys.Back)
  {
    base.OnKeyPress(e);
    return;
  }
  if (String.IsNullOrEmpty(this._ValidCharExpression))
  {
    base.OnKeyPress(e);
  }
  else
  {
    bool isValidChar = Regex.Match(e.KeyChar.ToString(),this._ValidCharExpression).Success;
    if (isValidChar)
    {
      base.OnKeyPress(e);
    }
    else
    {
      e.Handled = true;
    }
  }
}

Había colocado el código de expresión regular en el código de OnKeyPress, pero quiero permitir que se admitan todas las teclas especiales, como Ctrl-V, Ctrl-C y Retroceso.

Como puede ver, se maneja la tecla de retroceso. Sin embargo, Ctrl-V, por ejemplo, no puede ver la tecla V porque se ejecuta una vez para la tecla ctrl pero no ve ninguna tecla modificadora.

¿Cuál es la mejor manera de manejar esta situación?

¿Fue útil?

Solución

Puede usar uno de los eventos de OnKeyPress / OnKeyUp / OkKeyDown y luego usar el método Char.IsLetter para verificar que la clave ingresada es una letra.

Otros consejos

MaskedTextBox puede ser adecuado para usted.

También puede consultar FilterTextBox en CodeProjct. Puede usarlo (o el enfoque descrito) para hacer lo que pretende. La idea básica es cancelar el cambio antes de que sea visible (a través de un evento OnTextChanging).

¿Qué sucede si coloca la validación en OnTextChanged en lugar de OnKeyPress, pero cada vez que pasa la validación, guarda el valor en una variable? Luego, puede revertir si el usuario pega o escribe una cadena incorrecta, además de dar alguna otra sugerencia de UI de que algo no era válido (por ejemplo, establecer el texto de una etiqueta).

¿Por qué no coloca la comprobación de caracteres válidos en el evento OnTextChanged

?

y luego lidiar con Ctrl + C, Ctrl + V en la tecla de encendido hacia abajo

También puede usar las teclas de control e.Modifier == Keys.Control para probar las teclas de control

http://msdn.microsoft.com /en-us/library/system.windows.forms.keypresseventargs.aspx

La solución que he encontrado es comprobar las claves en el evento OnKeyDown y luego establecer una marca si se debe manejar la pulsación de tecla, que luego se verifica en el evento OnKeyPress.

protected override void OnKeyDown(KeyEventArgs e)
 {
    Keys keyCode = (Keys)e.KeyValue;
    base.OnKeyDown(e);
    if ((e.Modifiers == Keys.Control) ||
       (e.Modifiers == Keys.Control) ||
       (keyCode == Keys.Back) ||
       (keyCode == Keys.Delete))
    {
      this._handleKey = true;
    }
    else
    {
      // check if the key is valid and set the flag
      this._handleKey = Regex.Match(key.ToString(), this._ValidCharExpression).Success;
    }
  }




protected override void OnKeyPress(KeyPressEventArgs e)
  {
    if (this._handleKey)
    {
      base.OnKeyPress(e);
      this._handleKey = false;
    }
    else
    {
      e.Handled = true;
    }
  }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top