Pergunta

Alguém sabe por que a Microsoft não envia uma caixa de texto numérica com sua estrutura .NET, por exemplo.uma caixa de texto que garanta que os caracteres inseridos sejam sempre um número válido?É algo comumente usado em aplicativos de diferentes sabores e, na verdade, algo que a maioria das bibliotecas GUI (bem, aquelas que eu conheço) oferecem de alguma forma.Embora não seja que difícil escrever o seu próprio, também não é trivial.

Então, estou interessado em descobrir se alguém consegue racionalizar essa omissão.

editar:Obrigado pelas sugestões.Embora as caixas de texto mascaradas e as subidas numéricas tenham seu lugar;Estou interessado em um controle que se parece com uma caixa de texto, mas executa automaticamente a validação ao pressionar a tecla de que a entrada corresponde a um número válido.Na minha experiência (reconhecidamente limitada), isso é algo bastante usado (nem sempre queremos as restrições estáticas impostas pelas caixas de texto mascaradas, assim como nem sempre queremos os controles de cima para baixo ao lado) .

Existem muitas implementações com vários graus de qualidade na rede e, de fato, há até um exemplo disso na MSDN.

editar2:Obrigado pessoal, então parece que o up-down numérico é o controle .NET a ser usado apenas para entrada numérica (e a razão pela qual não temos um controle de caixa de texto numérico explícito).Teria sido ótimo se ele proibisse automaticamente a entrada de caracteres não numéricos (ao pressionar a tecla, ao colar, etc.), mas acho que é bom o suficiente para realizar a validação quando o controle perde o foco.E, alguém poderia fazer a validação ao pressionar a tecla, ao colar, se estivesse realmente interessado ...

Foi útil?

Solução

Eu concordo com a recomendação de Garry Shutler de usar NumericUpDown.Você pode não gostar dos controles para cima e para baixo, mas isso é a aparência padrão de um controle de entrada numérica no Windows, e você deve pensar duas vezes antes de usar uma aparência diferente.

Se você acabar codificando sua própria implementação (ou encontrando uma na web), há algumas armadilhas a serem observadas.Lembre-se de que há muitas maneiras de um valor entrar em um controle além do pressionamento de teclas.Aquele no seu link no MSDN nem substitui a colagem, então você pode facilmente pressionar Ctrl-V uma string não numérica no controle.

Outras dicas

Você poderia usar um MaskedTextBox

Existe o NuméricoUpDown controle que é feito especificamente para a entrada de números e pode ser usado como um TextBox.

A partir do WinForms 2.0, você tem um MaskedTextBox.Você pode definir a máscara como quiser, ou seja,para números, use a máscara todos os 0s.

Estranhamente, alguns dos controles do .NET Framework não expõem todos os recursos do controle subjacente do Windows que eles encapsulam.Neste caso, por algum motivo, o ES_NUMBER estilo não foi implementado.

Você poderia manipular o evento HandleCreated (ou substituir OnHandleCreated, já que TextBox não está selado) e chamar SetWindowLong para definir o ES_NUMBER estilo no controle Edit subjacente. ES_NUMBER é definido como 0x2000 em WinUser.h.

Você também pode derivar a classe TextBox e capturar o evento do teclado e garantir que nada além de números seja escrito.

Se fosse uma página Web, o mesmo teria sido feito com uma caixa de texto HTML usando Javascript.

A Microsoft deixa para terceiros preencher as lacunas relacionadas à falta de controles na caixa de ferramentas.Imagino que o tempo e o custo figurariam em sua lógica.

Neste caso, porém, penso que o FilteredTextBox fornece a funcionalidade que você descreve.

Com base na segunda edição:

O Perguntas frequentes sobre formulários do Windows informa como restringir caracteres em uma caixa de texto em questão 26.12:

26.12 Como posso restringir os caracteres que minha caixa de texto pode aceitar?

Você pode manipular o evento KeyPress da caixa de texto e, se o caracter passado não for aceitável, marcar o argumento events como mostrando que o caractere foi manipulado.Abaixo está um TextBox derivado que aceita apenas dígitos (e caracteres de controle como backspace, ...).Mesmo que o snippet use uma caixa de texto derivada, isso não é necessário, pois você pode simplesmente adicionar o manipulador ao seu formulário pai.

Consulte o FAQ para obter o exemplo de código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top