C# - Validando dados com Data Annotations com Windows Forms


A validação dos dados é uma tarefa essencial em qualquer aplicação seja ela desktop, mobile, para web,etc. A lógica de validação pode variar muito de aplicação para aplicação e pode se tornar um processo trabalhoso.

A partir da versão 4.0 da plataforma .NET temos a disposição no namespace System.ComponentModel.DataAnnotations, classes de atributos que são usadas para definir metadados e que podemos usar para realizar a validação dos dados.

Esse recurso é muito usado em aplicações ASP .NET MVC mas podemos usá-lo em qualquer tipo de aplicação. Neste artigo eu vou mostrar como usar o recurso em uma aplicação Windows Forms e em uma aplicação Console usando a linguagem C#.

Recursos usados:

Data Annotations - Conceitos Básicos

Os atributos Data Annotations foram introduzido no .NET 3.5 como uma forma de adicionar a validação para as classes usadas por aplicações ASP.NET. Desde aquela época, o RIA Services começou a usar anotações de dados e eles agora fazem parte do Silverlight também. No EF  o Code-First permite que você construa um EDM usando código (C#/VB .NET) e também permite realizar a validação com atributos Data Annotations.

Para este recurso devemos usar o namespace System.ComponentModel.DataAnnotations pois é ele que provê atributos de classes (usados para definir metadados) e métodos que podemos usar em nossas classes para alterar as convenções padrão e definir um comportamento personalizado que pode ser usado em vários cenários.

Os principais atributos usados para validação são:

1- Required - Obriga a entrada de um campo especificado.

[Required]
public string Nome { get ; set}

Parâmetros:  ErrorMessage - Define a mensagem de erro;  e    AllowEmptyStrings - Define se são permitidos valores em branco;

[Required(ErrorMessage="O nome do usuário é obrigatório",AllowEmptyStrings=false)]
 public string Nome { get; set; }

2- RegularExpression - Permite usar expressões regulares em validações mais específicas

[Required(ErrorMessage = "Informe o seu email")]
[RegularExpression(".+\\@.+\\..+",ErrorMessage = "Informe um email válido...")]

public string Email { get; set; }
 

3- Display - Define o texto que será visível para uma propriedade quando usada em um campo de formulário

[Required(ErrorMessage="O nome do usuário é obrigatório",AllowEmptyStrings=false)]
[Display(Name = "Nome do Usuário")]

public string UserName { get; set; }

4- StringLength - Determina a quantidade máxima de caracteres que poderá ser informada

 [Required]
 [Display(Name = "Informe a Senha")]
 [StringLength(10,MinimumLength=4)]

 public string Password { get; set; }

O parâmetro MinimumLength define a quantidade mínima de caracteres permitida

5- DataType - Associa um tipo adicional a uma propriedade

[Required]
[DataType(DataType.Password)]
[StringLength(10,MinimumLength=4)]
[Display(Name = "Password")]

public string Password { get; set; }

No exemplo acima a propriedade Password que é do tipo String possui um tipo adicional Password definido.

6- DisplayFormat - Aplica um formato definido a uma propriedade

[Required]
[Display(Name = "Data do pedido")]
[DisplayFormat(DataFormatString = "mm/dd/yyyy")]

public DateTime Datapedido { get; set; }
[Required]
[Display(Name = "Preco do Produto")]
[DisplayFormat(DataFormatString = "{0,c}")]

public decimal PrecoProduto { get; set; }

7- Range - Define um intervalo para uma propriedade onde a validação será aplicada

[Required]
[Display(Name = "Idade do beneficiário")]
[Range(18,65)]

public int idadeBeneficiario { get; set; }

Criando o projeto

Abra o Visual Studio 2012 Express for desktop e clique em FILE -> New Project selecionando o template Windows Forms Application informando o nome ValidandoComDataAnnotations e clique em OK;

A primeira ação que deveremos fazer é incluir uma referência ao namespace System.ComponentModel.DataAnnotations em nosso projeto.

No menu PROJECT clique em Add Reference e a seguir marque o item Assemblies selecionando o namespace e clicando no botão OK, conforme abaixo:

Agora vamos definir uma classe chamada Aluno que será objeto da nossa validação via Data Annotations.

No menu PROJECT clique em Add Class e informe o nome Aluno.cs. A seguir digite o código abaixo nesta classe:

using System.ComponentModel.DataAnnotations;

namespace ValidandoComDataAnnotations
{
    public class Aluno
    {
        //Id
        [Display(Name = "Código", Description = "Informe um inteiro entre 1 e 99999.")]
        [Range(1, 99999)]

        public int Id { get; set; }

        //Nome
        [Display(Name = "Nome Completo", Description = "Nome e Sobrenome.")]
        [Required(ErrorMessage = "O nome completo é obrigatório.")]
        [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$", ErrorMessage =
            "Números e caracteres especiais não são permitidos no nome.")]

        public string Nome { get; set; }

        //Email
        [Required(ErrorMessage = "O Email é obrigatório.")]
        [StringLength(100, MinimumLength = 5, ErrorMessage =
            "O Email deve ter no mínimo 5 e no máximo 100 caracteres.")]

        public string Email { get; set; }

        //Idade
        [Display(Name = "Idade", Description = "A idade deve estar entre 15 e 24 anos.")]
        [Range(15, 24)]

        public int Idade { get; set; }
    }
}

Estamos aplicando os atributos Data Annotations a cada campo da classe Aluno fazendo as seguintes validações:

Campo:

Id - Deve estar entre 1 e 99999
Nome - É obrigatório e não permite caracteres especiais
Email - É Obrigatório e deve possuir entre 5 e 100 caracteres
Idade - Deve estar entre 15 e 24 anos

Agora vamos definir uma classe getValidationErros que será responsável pela validação.

No menu PROJECT clique em Add Class e informe o nome Aluno.cs. A seguir digite o código abaixo nesta classe:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace ValidandoComDataAnnotations
{
    public static class Validacao
    {
        public static IEnumerable<ValidationResult> getValidationErros(object obj)
        {
            var resultadoValidacao = new List<ValidationResult>();
            var contexto = new ValidationContext(obj, null, null);
            Validator.TryValidateObject(obj, contexto, resultadoValidacao , true);
            return resultadoValidacao ;
        }
   }
}

Neste exemplo queremos validar a entidade Aluno e para isso estamos usando o método Validator.TryValidateObject(), que determina se o objeto especificado é válido, passando os seguintes parâmetros:

Nota: A classe Validator define uma classe auxiliar que pode ser usada para validar objetos, propriedades, métodos e quando é incluída em seus atributos associados de ValidationAttribute .

O método retorna uma lista de erros preenchidos com os objetos ValidationResult que descrevem os erros se a validação falhar ou vazios quando o objeto supera as restrições impostas.

Para testar a validação vamos incluir no formulário form1.cs a entrada do usuário via TextBox e botões de comando. Ao clicar no botão Gravar iremos fazer a validação usando as classes já definidas. Abaixo temos o formulário para validação:

No formulário vamos criar a rotina para exibir as mensagens de erro com o código a seguir:

private void ValidarAluno(object obj)
{
   var erros = Validacao.getValidationErros(obj);
   foreach (var error in erros)
   {
         MessageBox.Show((error.ErrorMessage));
   }
}

No evento Click do botão de comando vamos inserir o código abaixo onde chamamos a rotina ValidarAluno():

private void btnGravar_Click(object sender, EventArgs e)
{
       Aluno  _aluno = new Aluno();
       _aluno.Id = Convert.ToInt32(txtID.Text);
      _aluno.Nome = txtNome.Text;
      _aluno.Email = txtEmail.Text;
      _aluno.Idade = Convert.ToInt32(txtIdade.Text);
     ValidarAluno(_aluno);
 }

Abaixo vemos a validação em ação:

O exemplo é bem simples e pode ser melhorado, mas mostra que podemos usar os recursos da Data Annotations em aplicações Windows Forms.

Pegue o projeto completo aqui: ValidandoComDataAnnotations.zip

Rom 14:7 Porque nenhum de nós vive para si, e nenhum morre para si.

Rom 14:8 Pois, se vivemos, para o Senhor vivemos; se morremos, para o Senhor morremos. De sorte que, quer vivamos quer morramos, somos do Senhor.

Referências:


José Carlos Macoratti