Este tópico falará sobre o componente MaskedTextBox. O próprio nome é bastante sugestivo para a sua função, pois ele nada mais é do que um TextBox "mascarado". Ele define um padrão de entrada para dados. É como se fosse um molde inserido sobre um TextBox e que permite somente a inserção de dados padronizados. É muito simples de entender e usá-lo.
Vamos abrir a aplicação e em seguida o formulário de Cadastro de Clientes, que atualmente está da seguinte forma:
Agora vamos deletar o TextBox de inserção da Data de Nascimento, deixando-o assim:
Em seguida vamos arrastar um componente MaskedTextBox para o local onde estava o TextBox anterior e nomeá-lo para "mskDataNascimento", da seguinte forma:
O aspecto visual do MaskedTextBox é muito parecido com o de um TextBox comum, no entanto podemos observar a pequena seta na parte superior, que indica a existência de um menu de opções vinculado a este componente. Clicando nela, teremos:
E ao clicar na opção "Set Mask...", teremos:
Nesta tela definiremos a entrada da Máscara, ou seja, qual molde será colocado sobre o TextBox para limitar a inserção de dados. Como é possível observar na imagem acima, existem vários padrões, como para números inteiros, telefones, datas simples, datas com hora, apenas hora, CEP, além de ser possível personalizar uma máscara. Para o nosso caso selecionaremos Short date.
Ao clicar nela o Visual C# já preenche os campos Mask e Preview, na parte inferior da tela, dando-nos uma demonstração de como o campo será exibido ao usuário. Após clicarmos em OK veremos que o campo já se diferencia de um TextBox convencional, pois a máscara aparece inserida, conforme ilustra a imagem abaixo:
A parte visual está pronta, no entanto devemos alterar o código e trocar todos os comandos que faziam referência ao TextBox para adaptá-los ao MaskedTextBox. O primeiro trecho em que isso deve ser feito é no método construtor sobrecarregado, que possui o trecho de código:
Vejam que na imagem acima o TextBox que excluímos já aparece grifado, pois ele não é mais encontrado pela aplicação.
A alteração que devemos fazer neste trecho é:
O segundo trecho que deve ser alterado é dentro do código referente do evento Click do botão "Salvar". O método formataData passava como parâmetro o conteúdo do TextBox, mas agora deve passar o conteúdo do MaskedTextBox, devendo ser alterado como ilustra a imagem abaixo:
O mesmo deve ser feito para o código do evento Click do botão "Atualizar".
Agora é possível executar a aplicação. Notem que, ao manipular os dados no componente MaskedTextBox, é impossível inserir mais caracteres do que os correspondentes às datas, é impossível inserir letras e já existem as barras separando os dias, meses e anos, o que torna mais fácil a visualização para o usuário.
Validando o campo MaskedTextBox
Validar um campo do tipo MaskedTextBox é muito fácil. Para isso vamos fazer uso do evento TypeValidationCompleted, como ilustra a imagem abaixo:
Clicando duas vezes sobre ele criaremos o método de mesmo nome. Dentro dele colocaremos o seguinte código:
Comentando, teremos:
Agora, se tentarmos efetuar a inserção de uma data inválida, receberemos a mensagem de erro contida no bloco else.
Nossa validação está quase pronta. Eu digo "quase" porque se o usuário não digitar nada no MaskedTextBox ainda teremos um erro gerado, pois a validação pelo método TypeValidationCompleted só acontece quando um caractere é digitado. Existem várias maneiras de resolver isso, mas a que vou sugerir aqui envolve um conceito visto bem no começo do minicurso, portanto servirá como revisão. Estou me referindo à propriedade Enabled do botão "Salvar". Vamos defini-la por padrão como "False".
Agora vamos selecionar o MaskedTextBox e, na barra de eventos, localizar a opção KeyDown.
Dando dois cliques nela criaremos a função, que deverá ser preenchida com o seguinte código:
O método KeyDown é acionado sempre que qualquer tecla do teclado for pressionada. Como o vinculamos ao MaskedTextBox, ela só será acionada quando o usuário inserir qualquer caractere neste campo, habilitando, dessa forma, o botão "Salvar" que fará a validação dos dados. Agora fica impossível tentarmos salvar dados sem antes preenchermos o campo de data de nascimento, pois o botão permanecerá desabilitado, conforme ilustra a imagem abaixo:
Com isso encerramos a validação do MaskedTextBox. Na sequência veremos como percorrer todos os TextBoxes de um formulário para validá-los todos ao mesmo tempo.