Validação da entrada do usuário no Windows Forms

Quando os usuários inserem dados em seu aplicativo, convém verificar se os dados são válidos antes de seu aplicativo utilizá-los. Você pode exigir que determinados campos de texto não sejam de comprimento zero, que um campo seja formatado como um número de telefone ou outros tipos de dados bem formados ou que uma cadeia de caracteres não contenha caracteres desprotegidos que poderiam ser usados para comprometer a segurança de um banco de dados. O Windows Forms fornece várias maneiras para validar a entrada em seu aplicativo.

Validação com o controle MaskedTextBox

Se você precisar exigir que os usuários insiram dados em um formato bem definido, como um número de telefone ou um número de peça, poderá fazer isso rapidamente e com código mínimo usando o MaskedTextBox controle. Uma máscara é uma cadeia de caracteres composta de caracteres de uma linguagem de mascaramento que especifica quais caracteres podem ser inseridos em qualquer posição determinada de uma caixa de texto. O controle exibe um conjunto de avisos para o usuário. Se o usuário digita uma entrada incorreta, como digitar uma letra quando é necessário um dígito, o controle rejeitará automaticamente a entrada.

A linguagem de mascaramento usada por MaskedTextBox é muito flexível. Ela permite que você especifique os caracteres exigidos, caracteres opcionais, caracteres literais como hifens e parênteses, caracteres de moeda e separadores de data. O controle também funciona bem quando associado a uma fonte de dados. O Format evento em uma associação de dados pode ser usado para reformatar dados de entrada para estar em conformidade com a máscara, e o Parse evento pode ser usado para reformatar dados de saída para cumprir as especificações do campo de dados.

Para obter mais informações, consulte Controle MaskedTextBox.

Validação controlada por evento

Se você deseja ter controle total programático sobre a validação ou precisa realizar validações complexas, é necessário usar os eventos de validação incorporados à maioria dos controles dos Windows Forms. Cada controle que aceita entrada de usuário de forma livre tem um Validating evento que ocorrerá sempre que o controle exigir validação de dados. No método de manipulação de eventos, você pode validar a Validating entrada do usuário de várias maneiras. Por exemplo, se você tiver uma caixa de texto que deve conter um código postal, poderá realizar a validação das seguintes maneiras:

  • Se o código postal deve pertencer a um grupo específico de códigos postais, você pode realizar uma comparação de cadeia de caracteres na entrada para validar os dados inseridos pelo usuário. Por exemplo, se o código postal deve estar no conjunto {10001, 10002, 10003}, você pode usar uma comparação de cadeia de caracteres para validar os dados.

  • Se o código postal deve estar em uma forma específica, você pode usar expressões regulares para validar os dados inseridos pelo usuário. Por exemplo, para validar a forma ##### ou #####-####, você pode usar a expressão regular ^(\d{5})(-\d{4})?$. Para validar a forma A#A #A#, você pode usar a expressão regular [A-Z]\d[A-Z] \d[A-Z]\d. Para obter mais informações sobre expressões regulares, consulte Expressões regulares do .NET Framework e Exemplos de expressão regular.

  • Se o código postal deve ser um CEP válido dos Estados Unidos, você poderia chamar um serviço Web de código postal para validar os dados inseridos pelo usuário.

O Validating evento é fornecido um objeto do tipo CancelEventArgs. Se você determinar que os dados do controle não são válidos, poderá cancelar o evento definindo a Validating propriedade desse Cancel objeto como true. Se você não definir a propriedade, o Windows Forms assumirá que a validação foi bem-sucedida para esse controle e gerará o Cancel Validated evento.

Para obter um exemplo de código que valida um endereço de email em um TextBox, consulte Validating.

Vinculação de dados e validação controlada por evento

A validação é muito útil quando você tiver associado seus controles a uma fonte de dados, como uma tabela de banco de dados. Ao usar a validação, você pode verificar se os dados do seu controle satisfazem o formato exigido pela fonte de dados e, se eles não contêm caracteres especiais, como aspas e barras invertidas, que podem não ser seguros.

Quando você usa a associação de dados, os dados em seu controle são sincronizados com a fonte de dados durante a Validating execução do evento. Se você cancelar o Validating evento, os dados não serão sincronizados com a fonte de dados.

Importante

Se você tiver uma validação personalizada que ocorra após o Validating evento, isso não afetará a associação de dados. Por exemplo, se você tiver código em um Validated evento que tenta cancelar a associação de dados, a associação de dados ainda ocorrerá. Nesse caso, para executar a validação no evento, altere a Validated propriedade Data Source Update Mode do controle (em (Databindings)(Advanced))\ de OnValidation para Nunca e adicione Control.DataBindings["<YOURFIELD"].WriteValue()> ao seu código de validação.

Validação explícita e implícita

Então quando os dados de um controle são validados? Isso cabe a você, o desenvolvedor. Você pode usar a validação implícita ou explícita, dependendo das necessidades do seu aplicativo.

Validação implícita

A abordagem de validação implícita valida os dados enquanto o usuário os digita. Você pode validar os dados conforme eles são inseridos em um controle através da leitura das teclas enquanto elas são pressionadas ou, mais comumente, sempre que o usuário retirar o foco de entrada de um controle e movê-lo para o próximo. Essa abordagem é útil quando você deseja fornecer comentários imediatos sobre os dados, enquanto os usuários trabalham.

Se você quiser usar a validação implícita para um controle, você deve definir a propriedade desse AutoValidate controle como EnablePreventFocusChange ou EnableAllowFocusChange. Se você cancelar o Validating evento, o comportamento do controle será determinado pelo valor atribuído ao AutoValidate. Se você atribuiu EnablePreventFocusChange, cancelar o evento fará com que o Validated evento não ocorra. O foco de entrada permanecerá no controle atual até que o usuário altere os dados para uma entrada válida. Se você atribuiu EnableAllowFocusChange, o evento não ocorrerá quando você cancelar o evento, mas o foco ainda mudará para o Validated próximo controle.

A atribuição Disable à propriedade impede completamente a AutoValidate validação implícita. Para validar seus controles, você precisará usar a validação explícita.

Validação explícita

A abordagem de validação explícita valida os dados de uma só vez. Você pode validar os dados em resposta a uma ação do usuário, como clicar em um botão Salvar ou um link Avançar. Quando a ação do usuário ocorre, você pode disparar a validação explícita de uma das seguintes maneiras:

  • Ligue Validate para validar o último controle para ter perdido o foco.

  • Chamada ValidateChildren para validar todos os controles filho em um formulário ou controle de contêiner.

  • Chamar um método personalizado para validar manualmente os dados nos controles.

Comportamento de validação implícita padrão de controles dos Windows Forms

Diferentes controles do Windows Forms têm padrões diferentes para suas AutoValidate propriedades. A tabela a seguir mostra os controles mais comuns e seus valores padrão.

Control Comportamento de validação padrão
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid Propriedade não exposta no Visual Studio
ToolStripContainer Propriedade não exposta no Visual Studio
SplitContainer Inherit
UserControl EnableAllowFocusChange

Fechar o formulário e substituir a validação

Quando um controle mantém o foco porque os dados que ele contém são inválidos, é impossível fechar o formulário pai através das maneiras comuns:

  • Clicando no botão Fechar.

  • Selecionando Fechar no menu Sistema.

  • Chamando o Close método programaticamente.

No entanto, em alguns casos, você talvez queira permitir que o usuário feche o formulário independentemente se os valores nos controles são válidos. Você pode substituir a validação e fechar um formulário que ainda contém dados inválidos criando um manipulador para o evento do FormClosing formulário. No evento, defina a Cancel propriedade como false. Isso força o formulário a fechar. Para obter mais informações e um exemplo, consulte Form.FormClosing.

Observação

Se você forçar o formulário a fechar desta maneira, todos os dados nos controles do formulário que ainda não tiverem sido salvos serão perdidos. Além disso, os formulários modais não validam o conteúdo dos controles quando eles são fechados. Você ainda pode usar a validação de controle para bloquear o foco em um controle, mas você não precisa se preocupar com o comportamento associado ao fechamento do formulário.

Confira também