Pergunta

Eu preciso ser capaz de bloquear os caracteres válidos em uma caixa de texto, eu atualmente têm uma regex que eu possa verificar cada caractere contra tais como

[A-Za-z]

iria bloquear a apenas caracteres alfabéticos.

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;
    }
  }
}

I colocados o código regex no código OnKeyPress, mas eu wat para permitir que todas as chaves especiais, tais como Ctrl-V, Ctrl-C e de retrocesso para ser permitido.

Como você pode ver eu tenho a tecla de retrocesso sendo manipulado. No entanto, Ctrl-V, por exemplo, não pode ver a chave V porque ele é executado uma vez para a tecla ctrl mas não vê chaves quaisquer modificadores.

O que é a melhor maneira de lidar com esta situação?

Foi útil?

Solução

Você pode usar um dos OnKeyPress / OnKeyUp / eventos OkKeyDown e, em seguida, usar o método Char.IsLetter para verificar se a chave inserida é uma carta.

Outras dicas

MaskedTextBox pode ser bom para você.

Você também pode olhar para o FilterTextBox sobre a CodeProjct. Você pode usá-lo (ou a abordagem descrita) para fazer o que você pretende. A idéia básica é para cancelar a alteração antes que ela está se tornando visível (via um evento OnTextChanging).

E se você colocar a validação em OnTextChanged vez de OnKeyPress, mas cada vez que passa a validação de salvar o valor a uma variável? Em seguida, você pode reverter se as pastas de usuário ou tipos de cordas incorreto, bem como dar alguma outra dica UI que algo era inválido (por exemplo, definir o texto de uma etiqueta).

Por que você não colocar o cheque de caracteres válidos em caso OnTextChanged

e depois lidar com o Ctrl + C, Ctrl + V na na tecla para baixo

Além disso, você pode usar os e.ModifierKeys == Keys.Control de teste para teclas de controle

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

A solução que eu vim com é verificar as chaves no evento OnKeyDown e, em seguida, definindo um sinalizador se o keypress devem ser manipulados, que é então o check-in do 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top