Pergunta

O que é a melhor maneira de bloquear determinadas teclas de entrada de ser usado em uma caixa de texto com as batidas de tecla de bloqueio especiais como Ctrl-V / CTRL-C?

Por exemplo, apenas permitindo que o utilizador introduza um subconjunto de caracteres numéricos ou como A ou B ou C, e nada mais.

Foi útil?

Solução

Eu usaria o keydown evento e usar o e.Cancel para parar a chave se a chave não é permitido. Se eu quiser fazer isso em vários lugares, então eu faria um controle de usuário que herda uma caixa de texto e depois adicionar um allowedChars propriedade ou DisallowedChars que lidar com isso por mim. Eu tenho um par de variantes, que volta que eu uso para tempos em tempos, alguns permitir que o dinheiro de formatação e de entrada, alguns para edição tempo e assim por diante.

A boa coisa para fazê-lo como um controle de usuário é que você pode adicionar a ele e torná-lo para o seu próprio assassino-text-box. ;)

Outras dicas

Eu usei controle mascarado caixa de texto para winforms. Há uma explicação mais longa sobre isso aqui . Essencialmente, ele não permite entrada que não correspondem aos critérios para o campo. Se você não quer que as pessoas a digitar em qualquer coisa, mas números, ele simplesmente não lhes permitiria digitar nada, mas números.

Isto é como eu lidar com isso normalmente.

Regex regex = new Regex("[0-9]|\b");            
e.Handled = !(regex.IsMatch(e.KeyChar.ToString()));

Isso só vai permitir caracteres numéricos e o retrocesso. O problema é que você não terá permissão para usar teclas de controle neste caso. Gostaria de criar minha própria classe caixa de texto se você quer manter essa funcionalidade.

Eu encontrei a solução trabalhando apenas acabou sendo fazendo um pré-verificação da pressão de tecla no ProcessCmdKey para Ctrl-V, Ctrl-C, Delete ou de retrocesso, ea fazer mais uma validação se não fosse uma dessas chaves na o evento KeyPress usando uma expressão regular.

Isto não é provavelmente a melhor maneira, mas ele trabalhou na minha circunstância.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // check the key to see if it should be handled in the OnKeyPress method
    // the reasons for doing this check here is:
    // 1. The KeyDown event sees certain keypresses differently, e.g NumKeypad 1 is seen as a lowercase A
    // 2. The KeyPress event cannot see Modifer keys so cannot see Ctrl-C,Ctrl-V etc.
    // The functionality of the ProcessCmdKey has not changed, it is simply doing a precheck before the 
    // KeyPress event runs
    switch (keyData)
    {
        case Keys.V | Keys.Control :
        case Keys.C | Keys.Control :
        case Keys.X | Keys.Control :
        case Keys.Back :
        case Keys.Delete :
            this._handleKey = true;
            break;
        default:
            this._handleKey = false;
            break;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}


protected override void OnKeyPress(KeyPressEventArgs e)
{
    if (String.IsNullOrEmpty(this._ValidCharExpression))
    {
        this._handleKey = true;
    }
    else if (!this._handleKey)
    {
        // this is the final check to see if the key should be handled
        // checks the key code against a validation expression and handles the key if it matches
        // the expression should be in the form of a Regular Expression character class
        // e.g. [0-9\.\-] would allow decimal numbers and negative, this does not enforce order, just a set of valid characters
        // [A-Za-z0-9\-_\@\.] would be all the valid characters for an email
        this._handleKey = Regex.Match(e.KeyChar.ToString(), this._ValidCharExpression).Success;
    }
    if (this._handleKey)
    {
        base.OnKeyPress(e);
        this._handleKey = false;
    }
    else
    {
        e.Handled = true;
    }

}

Você pode usar o evento TextChanged para a caixa de texto.

    private void txtInput_TextChanged(object sender, EventArgs e)
    {
        if (txtInput.Text.ToUpper() == "A" || txtInput.Text.ToUpper() == "B")
        {
            //invalid entry logic here
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top