Partilhar via


Validação de 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 que seu aplicativo os use. Você pode exigir que determinados campos de texto não tenham comprimento zero, que um campo seja formatado como um número de telefone ou outro tipo de dados bem formados ou que uma cadeia de caracteres não contenha caracteres inseguros que possam ser usados para comprometer a segurança de um banco de dados. O Windows Forms fornece várias maneiras de 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, você pode fazer isso rapidamente e com o mínimo de código usando o controle MaskedTextBox. Uma máscara é uma cadeia de caracteres que especifica, através de uma linguagem de mascaramento, quais caracteres podem ser inseridos em qualquer posição na caixa de texto. O controle exibe um conjunto de prompts para o usuário. Se o usuário digitar uma entrada incorreta, por exemplo, o usuário digita uma letra quando um dígito é necessário, o controle rejeitará automaticamente a entrada.

A linguagem de mascaramento que é usada por MaskedTextBox é muito flexível. Ele permite especificar caracteres necessários, caracteres opcionais, caracteres literais, como hífenes e parênteses, caracteres de moeda e separadores de data. O controle também funciona bem quando vinculado a uma fonte de dados. O evento Format numa associação de dados pode ser usado para reformatar dados de entrada conforme a máscara, e o evento Parse pode ser usado para reformatar dados de saída conforme as especificações do campo de dados.

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

Event-Driven Validação

Se você quiser controle programático total sobre a validação ou precisar executar verificações de validação complexas, use os eventos de validação incorporados na maioria dos controles do Windows Forms. Cada controle que aceita entrada de usuário de forma livre tem um evento Validating que ocorrerá sempre que o controle exigir validação de dados. No Validating método de manipulação de eventos, você pode validar a 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á executar a validação das seguintes maneiras:

  • Se o código postal deve pertencer a um grupo específico de códigos postais, você pode executar 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}, então você pode usar uma comparação de cadeia de caracteres para validar os dados.

  • Se o código postal tiver de estar num formato específico, pode utilizar expressões regulares para validar os dados introduzidos pelo utilizador. Por exemplo, para validar o formulário ##### ou #####-####, você pode usar a expressão regular ^(\d{5})(-\d{4})?$. Para validar o formulário 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ões Regulares.

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

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

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

Vinculação de dados e validação de Event-Driven

A validação é muito útil quando você vincula seus controles a uma fonte de dados, como uma tabela de banco de dados. Usando a validação, você pode certificar-se de que os dados do seu controle satisfazem o formato exigido pela fonte de dados e que ele 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 execução do evento Validating. Se você cancelar o evento Validating, os dados não serão sincronizados com a fonte de dados.

Importante

Se você tiver uma validação personalizada que ocorre após o evento Validating, isso não afetará a associação de dados. Por exemplo, se você tiver código em um evento de Validated 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 propriedade Modo de Atualização da Fonte de Dados do controle (em (Databindings)(Advanced)) de OnValidation para Nevere adicione ControlYOURFIELD ao seu código de validação.

Validação implícita e explícita

Então, quando os dados de um controle são validados? Isso depende de 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 à medida que o usuário os digita. Você pode validar os dados à medida que os dados são inseridos em um controle lendo as teclas à medida que são pressionadas ou, mais comumente, sempre que o usuário tira o foco de entrada de um controle e passa para o próximo. Essa abordagem é útil quando você deseja dar ao usuário feedback imediato sobre os dados enquanto eles estão trabalhando.

Se você quiser usar a validação implícita para um controle, você deve definir a propriedade AutoValidate desse controle como EnablePreventFocusChange ou EnableAllowFocusChange. Se você cancelar o evento Validating, o comportamento do controle será determinado pelo valor que você atribuiu a AutoValidate. Se você atribuiu EnablePreventFocusChange, cancelar o evento fará com que o evento Validated 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 atribuíste EnableAllowFocusChange, o evento Validated não ocorrerá quando cancelares o evento, mas o foco ainda mudará para o próximo controlo.

A atribuição de Disable à propriedade AutoValidate impede completamente a validação implícita. Para validar seus controles, você terá que 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 em um link Avançar. Quando a ação do usuário ocorre, você pode acionar a validação explícita de uma das seguintes maneiras:

  • Chame Validate para validar o último controle que perdeu o foco.

  • Chame ValidateChildren para validar todos os controles filho num formulário ou num controle de contêiner.

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

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

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

Controlo 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

Fechando o formulário e substituindo 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 de uma das maneiras usuais:

  • Ao clicar no botão Fechar.

  • Ao selecionar Fechar no menu Sistema.

  • Chamando o método Close programaticamente.

No entanto, em alguns casos, talvez você queira permitir que o usuário feche o formulário, independentemente de os valores nos controles serem 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 FormClosing do formulário. No caso, defina a propriedade Cancel 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 dessa maneira, todos os dados nos controles do formulário que ainda não foram salvos serão perdidos. Além disso, os formulários modais não validam o conteúdo dos controlos quando são fechados. Você ainda pode usar a validação de controle para bloquear o foco em um controle, mas não precisa se preocupar com o comportamento associado ao fechamento do formulário.

Ver também