CollectionBase


É muito comum em runtime retornarmos valores da Base de Dados e armazenarmos em DataSets, mas com isso ocorre o “Weakly Typed” e o “Late Binding”, ou seja, não temos a segurança de tipos e o acesso à suas propriedades somente ocorre durante o tempo de execução.

Tendo esse problema, o que podemos fazer para termos nossos próprios objetos com suas respectivas propriedades e métodos ao invés de uma genérica? Então neste artigo explicarei como podemos criar uma coleção customizada, onde utilizaremos o CollectionBase.

Esta classe é fornecida através do Namespace System.Collections, criada justamente para essa finalidade. Criaremos uma coleção de Usuários e colocaremos dentro de um controle ASP.NET DataList.

O CollectionBase é uma classe onde podemos apenas herdá-la. Ela implementa três interfaces: IList, ICollection e IEnumerable que definem os métodos que aceitam tipos de System.Object. Além disso, ela ainda encapsula um ArrayList, onde ficarão armazenados os elementos da coleção.

Vamos nos dedicar aos seguintes métodos: Add, Contains, Insert, Item e Remove. Explicando cada método:


Function Add
Retorno: Integer
Adiciona um novo Item na Coleção e retorna o indíce (posição) que o objeto foi adicionado.

Function Contains
Retorno: Boolean
Verifica se já existe um determinado objeto dentro da Coleção e retorna um valor boleano indicando ou não sua existência.

Sub Insert
Insere um Item na Coleção em uma determinada posição.

Property Item
Retorna ou Recebe um objeto dado uma posição.

Sub Remove
Remove um objeto da Coleção.

Sub RemoveAt
Remove um objeto da Coleção dado uma posição.


Como dito anteriormente, vamos então criar nossa coleção customizada. Primeiramente devemos criar a nossa classe Usuario onde conterá as suas respectivas propriedades. Para isso, criarei uma WebApplication para criarmos e utilizarmos nossa coleção de exemplo. Depois de criado a WebApplication no Visual Studio .NET, adicione um novo arquivo *.vb (Class) e nomeie para Usuario.vb. Nossa classe deverá ficar conforme a estrutura abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
Public Class Usuario
 
    Private _nome As String
    Private _email As String
 
    Public Property Nome() As String
        Get
            Return Me._nome
        End Get
        Set(ByVal Value As String)
            Me._nome = Value
        End Get
    End Property
 
    Public Property Email() As String
        Get
            Return Me._email
        End Get
        Set(ByVal Value As String)
            Me._email = Value
        End Get
    End Property
 
End Class
 
Código 1 – A Classe Usuário e suas propriedades.

Como podemos ver acima, criamos a Classe Usuario com as seguintes propriedades: Nome e Email. Agora devemos criar uma nova Classe chamada UsuarioColecao que será a nossa Coleção de Usuários. Para isso adicionarei mais um arquivo *.vb no projeto com o nome: UsuarioColecao.vb. Aqui devemos herdar o System.Collections.CollectionBase e devemos escrever os métodos e propriedades (Add, Contains, Insert, Item e Remove) para trabalharmos apenas com objetos do tipo Usuario, garantindo assim a “Segurança de Tipos”. Veja o código abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
29
29
30
 
Public Class UsuarioColecao
 
    Inherits System.Collections.CollectionBase
 
    Public Function Add(ByVal objUsuario As Usuario) As Integer
        Return MyBase.List.Add(objUsuario)
    End Function
 
    Public Function Contains(ByVal objUsuario As Usuario) As Boolean
        Return MyBase.List.Contains(objUsuario)
    End Function
 
    Public Sub Insert(ByVal index As Integer, ByVal objUsuario As Usuario)
        MyBase.List.Insert(index, objUsuario)
    End Sub
 
    Default Public Property Item(ByVal index As Integer) As Usuario
        Get
            Return CType(MyBase.List(index), Usuario)
        End Get
        Set(ByVal Value As Usuario)
            MyBase.List(index) = Value
        End Get
    End Property
 
    Public Sub Remove(ByVal objUsuario As Usuario)
        MyBase.List.Remove(objUsuario)
    End Sub
 
End Class
 
Código 2 – Coleção de Usuários.

Acima podemos ver na linha 3 que herdamos a System.Collections.CollectionBase na nossa classe UsuarioColecao. E para garantirmos a segurança de tipos da coleção, ou seja, para que todos os métodos trabalhem apenas com um determinado tipo de objeto (no nosso caso, Usuario), devemos especificar isso para cada método e propriedade. Para os fãs de coleções, uma das grandes inovações do Visual Studio .NET Whidbey serão as coleções genéricas (Generics). Para maiores informações sobre o Generics: http://download.microsoft.com/download/c/7/f/c7f7a575-79ac-4399-9535-3ed57bc292f2/generics.doc.

Bem, agora nossa Classe UsuarioColecao já está pronta para trabalhar/aceitar apenas objetos do tipo Usuario, criado anteriormente. Vamos então à um exemplo prático de como usá-las:

Figura 1 – Intellisense já reconhece as propriedades da nossa Classe Usuario.

Como podem ver na figura 1, criamos um objeto do tipo Usuario e na medida que vamos precisando dele, instanciamos o mesmo (usuario = New Usuario()). Depois de cada objeto criado e atribuído a eles seus respectivos valores, você deve adicioná-lo à coleção de Usuario, qual também já criamos e instanciamos no início do código. Abaixo o código completo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Dim usuario As Usuario
Dim usuarioColecao As New UsuarioColecao()
 
usuario = New Usuario()
With usuario
    .Email = “israel@projetando.net”
    .Nome = “Israel Aéce”
End With
usuarioColecao.Add(usuario)
 
usuario = New Usuario()
With usuario
    .Email = “teste@servidor.net”
    .Nome = “José Augusto”
End With
usuarioColecao.Add(usuario)
 
Código 3 – Coleção de Usuários.

Figura 2 – Aceitando apenas objetos do tipo Usuario.

A figura 2 nos mostra algo bem interessante, pois reparem a o método Add qual utilizamos para adicionar um novo objeto Usuario em nossa coleção. Ele só aceita um objeto do tipo Usuario. Se tentarmos colocar uma String por exemplo, ele dará erro de compilação.

Como vimos, para todos os métodos (Add, Contains, Insert, Item e Remove) eles apenas irão trabalhar com objetos do tipo Usuario. Como disse no inicio do artigo, vou explicar como popular um controle DataList através de uma Coleção.

Logo após de criar e popular os objetos conforme o código 3, apenas devemos atribuir a Coleção à propriedade DataSource do DataList, e também colocar no HTML as propriedades que deseja exibir. O código abaixo carrega o controle DataList no evento Page_Load do WebForm:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Dim usuario As Usuario
Dim usuarioColecao As New UsuarioColecao()
 
usuario = New Usuario()
With usuario
    .Email = “israel@projetando.net”
    .Nome = “Israel Aéce”
End With
usuarioColecao.Add(usuario)
 
usuario = New Usuario()
With usuario
    .Email = “teste@servidor.net”
    .Nome = “José Augusto”
End With
usuarioColecao.Add(usuario)
 
With Me.dtlColecao
    .DataSource = usuarioColecao
    .DataBind()
End With
 
Código 4 – Carregando o controle DataList (Linha 18 à 21).

Ainda temos que colocar os campos que desejamos exibir no HTML. Para isso você deve utilizar as áreas ItemTemplate e AlternatingItemTemplate. No código abaixo estou exibindo as duas propriedades (Nome e Email) do objeto Usuario:

1
2
3
4
5
6
7
8
9
10
 
<asp:DataList…>
    <ItemTemplate>
        Nome: <%# DataBinder.Eval(Container.DataItem, “Nome”)%><br>
        Email: <%# DataBinder.Eval(Container.DataItem, “Email”)%>
    </ItemTemplate>
    <AlternatingItemTemplate>
        Nome: <%# DataBinder.Eval(Container.DataItem, “Nome”)%><br>
        Email: <%# DataBinder.Eval(Container.DataItem, “Email”)%>
    </AlternatingItemTemplate>
</asp:DataList>
 
Código 5 – Código HTML do DataList com as propriedades do objeto Usuario.

Como podem ver abaixo, o controle DataList carregado com os dados e exibindo as propriedades do objeto Usuario:

Figura 3DataList já carregado.

E quando utilizamos DataGrid não há problemas com relação à paginação como acontece com o DataReader. E também quando for definir as colunas de um DataGrid, ao invés de no campo Data Field do Property Builder, você informar o nome do campo da Base de Dados, você apenas atribui à ele o nome da propriedade que deseja exibir.

E ainda você pode optar por escrever os itens da coleção. Para isso basta executar um laço For…Next e percorrer a coleção e escrever os seus itens. O código abaixo explica como fazer isso:

1
2
3
4
5
 
Dim i As Integer
For i = 0 To usuarioColecao.Count – 1
    Response.Write(“Nome: ” & usuarioColecao.Item(i).Nome & “<br>”)
    Response.Write(“Email: ” & usuarioColecao.Item(i).Email & “<br><br>”)
Next
 
Código 6 – Percorrendo e escrevendo os itens da Coleção.

E o resultado ficará algo como:

Figura 4Escrevendo os Itens da Coleção.

Conclusão: Neste artigo vimos como é simples construirmos Coleções customizadas derivadas do System.Collections.CollectionBase. Apesar de que para cada objeto, temos que ter uma Coleção específica, onde temos que reescrever cada método para que aceite um determinado objeto. Mas com o Generics as coisas ficaram mais fáceis, mas de qualquer forma, vimos a facilidade de escrever Coleções customizadas e atribuirmos à um controle.

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s