.NET

17 jul, 2007

Validação Simples – Windows Forms

Publicidade

Olá pessoal. Desta vez, gostaria de comentar um pouco sobre um ponto fundamental em qualquer aplicação. Validação de Dados. Embora trabalhosa (e eu diria até chata) de se codificar, a validação de dados é um ponto crucial em seu aplicativo. Uma boa validação, assegura que seu aplicativo funcione de maneira estável e siga o fluxo programado.

Como primeiro exemplo, usarei o sistema mais simples de validação no front-end. Exemplo.

Aplicativo de exemploAplicativo de exemplo

Validação no Front-End

A validação na UI deve ser rápida e garantir que o input do usuário está dentro do escopo pré-determinado para o campo especifico. No exemplo, a primeira TextBox espera um valor numérico, que será convertido para o formato Currency (Moeda – R).

private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            //Catches numeric keystrokes
            if (e.KeyValue < 58)
            {
                if (e.KeyValue < 48  e.KeyValue > 57)
                {
                    //Backspace
                    if (e.KeyValue == 8)
                    {
                        e.SuppressKeyPress = false;
                    }
                    //Enter
                    else if (e.KeyValue == 13)
                    {
                        e.SuppressKeyPress = false;
                        this.ValidateFill(this.textBox1);
                    }
                    else
                    {
                        if (e.KeyCode == Keys.Left  e.KeyCode == Keys.Right  e.KeyCode == Keys.Up  e.KeyCode == Keys.Down)
                        {
                            e.SuppressKeyPress = true;
                        }
                        else
                        {
                            e.SuppressKeyPress = false;
                        }
                    }
                }
                else
                {
                    if (e.Modifiers == Keys.Shift  e.Modifiers == Keys.ShiftKey)
                    {
                        e.SuppressKeyPress = true;
                    }
                    else
                    {
                        e.SuppressKeyPress = false;
                    }
                }
            }
            //Catches Numpad keystrokes
            else
            {
                    if (e.KeyValue < 96  e.KeyValue > 105)
                    {
                        e.SuppressKeyPress = true;
                    }
                    else
                    {
                        e.SuppressKeyPress = false;
                    }
            }
                this.label1.Text = e.KeyCode.ToString();
                this.label2.Text = e.KeyValue.ToString();
                this.label5.Text = e.KeyData.ToString();
                this.label6.Text = e.Modifiers.ToString();
        }

Existem eventos distintos onde podemos aplicar sua regra de validação. O evento KeyDown do TextBox, ocorre após o pressionamento da tecla e antes da entrada ser processada visualmente. Lógicamente este é o lugar perfeito, pois estaremos filtrando a entrada do usuário antes desta ser mostrada na tela.

Há diversas maneiras de se capturar o input do usuário. Em todos eventos (KeyDown,KeyUp e KeyPress) há um argumento do tipo KeyEventArgs. Este argumento contem 3 propriedades que nos possibilitam recuperar a entrada do usuário, são eles: KeyData, KeyValue e KeyCode.

KeyValue retorna um int32 que corresponde ao código ASCII da tecla pressionada. Como esperamos receber apenas numeros em nosso campo, o primeiro filtro checa se a entrada do usuário foi uma tecla numerica (Numpad ou Keypad). Se a entrada não for uma tecla numerica eu indico ao aplicativo que aquela entrada não deve ser processada, com e.SuppressKeyPress = true.

O segundo filtro checa se a tecla backspace ou enter foi pressionada. Devemos dar a chance ao usuário de corrigir o numero digitado ou finalizar a entrada e passar para o proximo campo.

O terceiro filtro checa se a tecla Shift estava pressionada no momento da entrada. Isso pode ser feito de 2 maneiras:

Visualizando a propriedade Modifiers de KeyEventArgs (e.Modifiers == Keys.Shift), ou pela propriedade KeyCode, que retorna um valor da enumeração Keys de System.Windows.Forms (e.KeyCode == Keys.Left…).

Depois que a entrada do usuário já foi filtrada e está dentro do esperado, podemos com segurança formatar a entrada. Nessa caso desejo demonstrar um valor monetario. Para isso uso uma sobrecarga de ToString, que toma como parametro uma string que indica como deverá ser feita a formatação pela CLR.

private void ValidateFill(System.Windows.Forms.Control ctl)
        {
            System.Windows.Forms.TextBox t = (System.Windows.Forms.TextBox)ctl;
            try
            {
                int s = System.Convert.ToInt32(ctl.Text);
                t.Text = s.ToString("C");
                MessageBox.Show("Validado!");
                System.Windows.Forms.Control c = this.GetNextControl(ctl, true);
                c.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Nao e int32");
                t.Text = "0,00";
                t.Focus();
            }

Conclusão

Este foi um exemplo bem simples de validação e formatação. Na próxima semana, veremos como podemos usar recursos mais sofisticados de validação com Regex.

Até a próxima!