Desenvolvimento - Visual Basic .NET

Formatação de TextBox - WinForms

Com a extinção do antigo MaskEditBox (Visual Basic 6) pelo menos até versão 2003 do Visual Studio.net, a formatação do TextBox passou a ser uma tarefa manual, que deve ser implementada pelo desenvolvedor. Neste artigo estarei demonstrando como criar uma função genérica para a formatação de TextBox.

por Alexandre Tarifa



Com a extinção do antigo MaskEditBox (Visual Basic 6) pelo menos até versão 2003 do Visual Studio.net, a formatação do TextBox passou a ser uma tarefa manual, que deve ser implementada pelo desenvolvedor. Neste artigo estarei demonstrando como criar uma função genérica para a formatação de TextBox.

Codificação

Inicie um novo projeto do tipo Visual Basic e com o template Windows Aplication (figura 1).

Desenhando o formulário

Vamos criar um único formulário chamado frmFormatacao, desenhe o formulário conforme a imagem abaixo:

Adicione ao projeto uma nova Classe (Menu Project - Add Class) com o nome de clFuncaoGeral. Para facilitar a utilização da função, crie um Enum conforme listagem abaixo:

Public Enum OpcaoFormata
     ForCep = 1
     ForData = 2
     forCNPJ = 3
     forCPF = 4
     forTelefone = 5
End Enum

Este Enum será utilizado na chamada da função onde implementaremos cada tipo de formatação listada.

A função receberá 2 parâmetros: Opção do tipo OpcaoFormata (Enum criado) e txtText do tipo TextBox:

Public Function gfFormataCampo(ByVal Opcao As OpcaoFormata, ByVal txtTexto As TextBox)

Implemente dentro da função cada tipo de formatação:

        Select Case Opcao

            Case OpcaoFormata.ForData

                If Len(txtTexto.Text) = 2 Or Len(txtTexto.Text) = 5 Then
                    txtTexto.Text = txtTexto.Text & "/"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                End If

            Case OpcaoFormata.ForCep

                If Len(txtTexto.Text) = 5 Then
                    txtTexto.Text = txtTexto.Text & "-"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                End If

            Case OpcaoFormata.forCNPJ

                If Len(txtTexto.Text) = 2 Or Len(txtTexto.Text) = 6 Then
                    txtTexto.Text = txtTexto.Text & "."
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                End If

                If Len(txtTexto.Text) = 10 Then
                    txtTexto.Text = txtTexto.Text & "/"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                End If

                If Len(txtTexto.Text) = 15 Then
                    txtTexto.Text = txtTexto.Text & "-"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                End If

            Case OpcaoFormata.forCPF

                If Len(txtTexto.Text) = 3 Then
                    txtTexto.Text = txtTexto.Text & "."
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                ElseIf Len(txtTexto.Text) = 7 Then
                    txtTexto.Text = txtTexto.Text & "."
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                ElseIf Len(txtTexto.Text) = 11 Then
                    txtTexto.Text = txtTexto.Text & "-"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                End If

            Case OpcaoFormata.forTelefone

                If Len(txtTexto.Text) = 0 Then
                    txtTexto.Text = txtTexto.Text & "("
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                ElseIf Len(txtTexto.Text) = 3 Then
                    txtTexto.Text = txtTexto.Text & ")"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                ElseIf Len(txtTexto.Text) = 8 Then
                    txtTexto.Text = txtTexto.Text & "-"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1
                End If


        End Select

Temos nossa função criada, o próximo passo é colocar no nosso formulário a chamada para a função. Vamos utilizar o evento KeyPress de cada TextBox que criamos. O primeiro TextBox a ser formatado será o de Data. No evento KeyPress entre com o seguinte código:

    Private Sub txtData_KeyPress(ByVal sender As Object, ByVal e As 
System.Windows.Forms.KeyPressEventArgs) Handles txtData.KeyPress
        Dim cl As New clFuncaoGeral
        cl.gfFormataCampo(clFuncaoGeral.OpcaoFormata.ForData, txtData)
    End Sub

Execute a aplicação e digite um valor qualquer de uma data. Note que a formatação do TextBox é efetuada:

Vamos criar a chamada para todos os TextBox, conforme abaixo:

Private Sub txtCep_KeyPress(ByVal sender As Object, ByVal e As 
System.Windows.Forms.KeyPressEventArgs) Handles txtCep.KeyPress
        Dim cl As New clFuncaoGeral
        cl.gfFormataCampo(clFuncaoGeral.OpcaoFormata.ForCep, txtCep)
    End Sub

    Private Sub txtCnpj_KeyPress(ByVal sender As Object, ByVal e As 
System.Windows.Forms.KeyPressEventArgs) Handles txtCnpj.KeyPress
        Dim cl As New clFuncaoGeral
        cl.gfFormataCampo(clFuncaoGeral.OpcaoFormata.forCNPJ, txtCnpj)
    End Sub

    Private Sub txtCpf_KeyPress(ByVal sender As Object, ByVal e As 
System.Windows.Forms.KeyPressEventArgs) Handles txtCpf.KeyPress
        Dim cl As New clFuncaoGeral
        cl.gfFormataCampo(clFuncaoGeral.OpcaoFormata.forCPF, txtCpf)
    End Sub

    Private Sub txtTelefone_KeyPress(ByVal sender As Object, ByVal e As 
System.Windows.Forms.KeyPressEventArgs) Handles txtTelefone.KeyPress
        Dim cl As New clFuncaoGeral
        cl.gfFormataCampo(clFuncaoGeral.OpcaoFormata.forTelefone, txtTelefone)
    End Sub

Execute novamente o projeto e entre com os valores nos campos:

Para estender os tipos de formatação, basta adicionar no Enum que criamos e implementar dentro da classe o novo tipo de formatação.

Para baixar o projeto completo clique aqui.

Conclusão: a formatação de TextBox pode ser facilitada com a criação desta função genérica, em versões futuras teremos o controle de máscara já nativo no Visual Studio (http://www.windowsforms.net/WhidbeyFeatures/default.aspx?PageID=2&ItemID=7&Cat=Controls&tabindex=4).

Se você tem interesse em aprender .net ou discutir .net entre no grupo de usuários Codificando.net - São Paulo.

Se tiver alguma dúvida, crítica, sugestão de artigo, fale comigo: atarifa@deloitte.com

Abraço.
Alexandre Tarifa
Líder Codificando.net SP

Alexandre Tarifa

Alexandre Tarifa - Ministra palestras e treinamentos, MVP (Most Valuable Professional), MCAD (Microsoft Certified Application Developer) e MCT (Microsoft Certified Trainer). Bacharel pela UMESP e pós-graduando pela Universidade Federal de São Carlos em Ciência da Computação. Analista de Sistemas e Líder do grupo de usuários Codificando.net São Paulo (sp.codificando.net). Escreve artigos para a revista MSDN Magazine e para os sites Linha de Código, MSDN Brasil e Enterpriseguys.
Visite o blog do autor: http://weblogs.pontonetpt.com/alexandretarifa/.