Eu tenho um aplicativo de formulários do Windows com um controle de caixa de texto que eu quero aceitar apenas valores inteiros. No passado, eu fiz esse tipo de validação sobrecarregando o evento KeyPress e apenas removendo caracteres que não se encaixavam na especificação. Eu olhei para o controle MaskedTextBox, mas gostaria de uma solução mais geral que pudesse funcionar talvez com uma expressão regular ou depender dos valores de outros controles.
Idealmente, isso se comportaria de tal maneira que pressionar um caractere não numérico não produziria resultado ou forneceria imediatamente ao usuário feedback sobre o caractere inválido.
Respostas:
Duas opções:
Use um em
NumericUpDown
vez disso. NumericUpDown faz a filtragem para você, o que é legal. É claro que também oferece aos usuários a capacidade de pressionar as setas para cima e para baixo no teclado para aumentar e diminuir o valor atual.Manipule os eventos de teclado apropriados para impedir qualquer coisa, menos a entrada numérica. Eu tive sucesso com esses dois manipuladores de eventos em um TextBox padrão:
Você pode remover a verificação
'.'
(e a verificação subsequente de mais de uma'.'
) se o seu TextBox não permitir casas decimais. Você também pode adicionar uma verificação para ver'-'
se o seu TextBox deve permitir valores negativos.Se você deseja limitar o usuário ao número de dígitos, use:
textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits
fonte
E só porque é sempre mais divertido fazer coisas em uma linha ...
NOTA: Isso NÃO impede que um usuário copie / cole nesta caixa de texto. Não é uma maneira segura de limpar seus dados.
fonte
KeyPress
eventos da mesma caixa de texto. Um evento pode ser definidoe.Handled
como true e outro pode ser definido como false. Em geral, é melhor usar #if (...) e.Handled = true;
TextChanged
evento que vai sobre ele com um regex pode corrigir copiar e colar;)Estou partindo do contexto e das tags que você usou para escrever um aplicativo .NET C #. Nesse caso, você pode assinar o evento alterado de texto e validar cada toque de tecla.
fonte
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
Aqui está um controle personalizado simples do Winforms, derivado do TextBox padrão, que permite apenas a entrada System.Int32 (pode ser facilmente adaptado para outros tipos, como System.Int64, etc.). Ele suporta operações de copiar / colar e números negativos:
Atualização 2017 : Minha primeira resposta tem alguns problemas:
Então, eu vim com outra versão mais genérica, que ainda suporta copiar / colar, + e - assinar, etc.
Para o Int32, você pode derivar dele, assim:
ou sem derivação, use o novo evento TextValidating como este:
mas o que é legal é que funciona com qualquer string e qualquer rotina de validação.
fonte
É exatamente para isso que os eventos Validados / Validados foram projetados.
Aqui está o artigo do MSDN sobre o tópico: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
A versão TL; DR: verifique a propriedade .Text no evento Validating e configure
e.Cancel=True
quando os dados são inválidos.Quando você define e.Cancel = True, o usuário não pode sair do campo, mas você precisará fornecer algum tipo de feedback de que algo está errado. Altero a cor de fundo da caixa para vermelho claro para indicar um problema. Certifique-se de configurá-lo novamente
SystemColors.Window
quando a validação for chamada com um bom valor.fonte
Validating
.<nitpick>
O OP menciona que desabilitar / indicar imediatamente um caracter inválido é ideal, masValidating
parece exigir que o foco seja movido para outra forma / controle antes que ele entre em vigor.</nitpick>
Ainda assim, essa é uma ótima abordagem e sempre vale a pena considerar no caso mais geral.Experimente um MaskedTextBox . É necessário um formato de máscara simples para que você possa limitar a entrada a números ou datas ou qualquer outra coisa.
fonte
Você pode usar o
TextChanged
eventofonte
Undo()
, mas resulta em umStackOverflowException
.public int txtBoxValue
, e se o tryParse não funcionar, eu reverto o texto no txtBox portxtBox.Text = txtBoxValue.ToString();
Isso pode ser útil. Permite valores numéricos "reais", incluindo pontos decimais adequados e sinais de mais ou menos anteriores. Chame de dentro do evento KeyPress relacionado.
fonte
Eu tenho trabalhado em uma coleção de componentes para concluir as coisas ausentes no WinForms, aqui está: Formulários avançados
Em particular, esta é a classe para um Regex TextBox
Basta adicionar algo como
myNumbericTextBox.RegexString = "^(\\d+|)$";
deve ser suficiente.fonte
Basta usar um
NumericUpDown
controle e definir a visibilidade desses botões feios para baixofalse
.NumericUpDown
é, na verdade, uma coleção de controles que contêm uma 'caixa giratória' (botões para cima e para baixo), uma caixa de texto e algum código para validar e agrupar tudo.Marcação:
ocultará os botões enquanto mantém o código subjacente ativo.
Embora não seja uma solução óbvia, é simples e eficaz.
.Controls[1]
ocultaria a parte da caixa de texto se você quisesse fazer isso.fonte
Eu fiz algo para isso no CodePlex .
Funciona interceptando o evento TextChanged. Se o resultado for um bom número, ele será armazenado. Se houver algo errado, o último bom valor será restaurado. A fonte é um pouco grande demais para ser publicada aqui, mas aqui está um link para a classe que lida com o núcleo dessa lógica.
fonte
basta usar este código na caixa de texto:
fonte
Em nossa página da Web com a definição de caixa de texto, podemos adicionar um
onkeypress
evento para aceitar apenas números. Não mostrará nenhuma mensagem, mas impedirá a entrada incorreta. Funcionou para mim, o usuário não pôde digitar nada, exceto o número.fonte
você pode usar o evento TextChanged / Keypress, usar uma regex para filtrar números e executar alguma ação.
fonte
Eu lidaria com isso no evento KeyDown.
fonte
tente isso é muito simples
fonte
Dê uma olhada no tratamento de entrada no WinForm
Publiquei minha solução que usa os eventos ProcessCmdKey e OnKeyPress na caixa de texto. Os comentários mostram como usar um Regex para verificar o pressionamento de tecla e bloquear / permitir adequadamente.
fonte
Oi, você pode fazer algo assim no evento de alteração de texto da caixa de texto.
aqui está uma demonstração
fonte
Parece que muitas das respostas atuais para esta pergunta estão analisando manualmente o texto de entrada. Se você está procurando um tipo numérico interno específico (por exemplo,
int
oudouble
), por que não delegar o trabalho aoTryParse
método desse tipo ? Por exemplo:Se você deseja algo mais genérico, mas ainda compatível com o Designer do Visual Studio:
E, finalmente, se você deseja algo totalmente genérico e não se importa com o suporte do Designer:
fonte
É necessário aceitar números inteiros e flutuantes, incluindo os números negativos.
fonte
Esta é a minha abordagem:
e qualquer número de tamanho
fonte
Usando a abordagem descrita na resposta de Fabio Iotti, criei uma solução mais genérica:
"ValidatedTextBox", que contém todo o comportamento de validação não trivial. Tudo o que resta a fazer é herdar dessa classe e substituir o método "IsValid" por qualquer lógica de validação necessária. Por exemplo, usando esta classe, é possível criar "RegexedTextBox", que aceitará apenas cadeias que correspondam a expressões regulares específicas:
Depois disso, herdando da classe "RegexedTextBox", podemos criar facilmente os controles "PositiveNumberTextBox" e "PositiveFloatingPointNumberTextBox":
fonte
Desculpe acordar os mortos, mas achei que alguém poderia achar isso útil para referência futura.
Aqui está como eu lido com isso. Ele lida com números de ponto flutuante, mas pode ser facilmente modificado para números inteiros.
Basicamente, você pode pressionar apenas 0 - 9 e .
Você pode ter apenas um 0 antes do .
Todos os outros caracteres são ignorados e a posição do cursor é mantida.
Aqui está uma versão int rapidamente modificada:
fonte
Este funciona com copiar e colar, arrastar e soltar, tecla pressionada, evita o estouro e é bastante simples
fonte
Não esqueça que um usuário pode colar um texto inválido em um arquivo
TextBox
.Se você deseja restringir isso, siga o código abaixo:
fonte
Eu também estava procurando a melhor maneira de verificar apenas números na caixa de texto e o problema com o pressionamento de tecla foi que ele não suporta copiar e colar com o botão direito ou a área de transferência, então surgiu esse código que valida quando o cursor sai do campo de texto e também procura por campo vazio. (versão adaptada do newguy)
fonte
fonte
3 solução
1)
2) uma outra solução do msdn
}
fonte http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx
3) usando o MaskedTextBox: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx
fonte
Ao clicar no botão, você pode verificar o texto da caixa de texto por for loop:
fonte
Resposta mais simples:
fonte