Desenvolvimento - Visual Basic .NET

Winforms - Expandindo controles

Neste artigo estarei mostrando como expandir um controle TextBox criando algumas funcionalidades e propriedades novas.

por Alexandre Tarifa



Nem sempre os controles disponíveis pelo Visual Studio nos trazem todas as funcionalidades que necessitamos. Algumas vezes ampliar os recursos dos controles ou até mesmo criar um controle em cima de uma já existente pode se tornar um grande negócio.

Neste artigo estarei mostrando como expandir um controle TextBox criando algumas funcionalidades e propriedades novas.

Criando a aplicação

Crie um novo projeto no Visual Studio (File> New> Project), selecione o project type Visual Basic Project, o template Windows Application, nome Controles e clique em OK.

Após a criação da aplicação, vamos adicionar o novo controle. No Solution Explorer , clique com o botão direito do mouse sobre o projeto Controles, Add, Add New Item. Selecione o template Custom Control e o nome NovoTextBox.

Uma janela de design é aberta, porém nada é exibido. Não temos acesso ao design do TextBox, portanto somente o código é alterado. Para ver o código precione F7.

Nossa primeira implementação no controle será adicionar uma propriedade para definir se o TextBox receberá somente valores numéricos.

O primeiro passo é alterar no topo do código a herança que é feita no início do código, devemos alterar Inherits System.Windows.Forms.Control para Inherits System.Windows.Forms.TextBox. Esta alteração é feita porque vamos ampliar as funcionalidades de um controle específico. No caso, um TextBox.

Para criar uma nova propriedade do controle é simples, temos que declarar uma propriedade chamada Numérico do tipo boleano, conforme abaixo:

 Private _Numerico As Boolean
 Public Property Numerico() As Boolean
     Get
         Return _Numerico
     End Get
     Set(ByVal Value As Boolean)
         _Numerico = Value
     End Set
 End Property

O próximo passo é sobrescrever a sub OnKeyPress, conforme abaixo:

Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
     If _Numerico = True Then
         If e.KeyChar>= "0" And e.KeyChar 
O evento OnKeyPress (quando é digitado algo no TextBox) quando tiver a propriedade Numérico como True, somente caracteres numéricos são aceitos.

Para testar a aplicação, devemos compilar a aplicação (Ctrl+Shift+B). Abra o Form1, abra a janela ToolBox (Ctrl + Alt + X), clique com o botão direito do mouse, Add/Remove Items, Browse, selecione o arquivo Controles.exe na pasta Bin do seu projeto, selecione o NovoTextBox e clique em OK.

Foi adicionado na ToolBox o novo controle, arraste o novo controle para o formulário. Selecione as propriedades do controle (F4), vá na propriedade Numérico e selecione True. Adicione outro NovoTextBox e não altera nenhuma propriedade. Execute a aplicação (F5). Teste com letras o primeiro TextBox e note que nenhum caractere é digitado, digite números, e somente números são adicionados.

Vamos alterar nosso controle, delete toda a implementação do Evento OnKeyPress e a propriedade numérico.

Vamos criar um Enumerador com todas as possibilidades de formatação:

 Public Enum TipoFormatacao
     Nenhum
     ForCep
     ForData
     forTelefone
     forHora
 End Enum

Também crie uma nova propriedade que receberá o valor do Enumerador:

 Private Formatacao As TipoFormatacao
 Public Property Formatacao() As TipoFormatacao
     Get
         Return _Formatacao
     End Get
     Set(ByVal Value As TipoFormatacao)
         _Formatacao = Value
     End Set
 End Property

Vamos novamente redefinir OnKeyPress:

Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)

        Select Case _Formatacao
            Case OpcaoFormata.ForCep
                If Len(Me.Text) = 5 Then
                    Me.Text = Me.Text & "-"
                    Me.SelectionStart = Len(Me.Text) + 1
                    Me.MaxLength = 9
                End If
            Case OpcaoFormata.ForData
                If Len(Me.Text) = 2 Or Len(Me.Text) = 5 Then
                    Me.Text = Me.Text & "/"
                    Me.SelectionStart = Len(Me.Text) + 1
                    Me.MaxLength = 10
                End If
            Case OpcaoFormata.forHora
                If Len(Me.Text) = 2 Then
                    Me.Text = Me.Text & ":"
                    Me.SelectionStart = Len(Me.Text) + 1
                    Me.MaxLength = 5
                End If
            Case OpcaoFormata.forTelefone

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

        End Select

    End Sub

Agora nosso controle possui uma propriedade chamada TipoFormatacao onde através de uma combo selecionaremos a opção:

Selecione as opções diretamente no TextBox e execute o projeto. Digite os valores e veja que a formatação selecionada é efetuada.

Além dessas implementações podemos criar várias, vai da necessidade que temos. Lembrando também que qualquer controle pode ter as suas propriedades expandidas.

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ços.
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/.