Desenvolvimento - Visual Basic .NET

Utilizando o System.Collections.CollectionBase

Neste artigo explicarei como podemos criar uma coleção customizada, onde utilizaremos o CollectionBase.

por Israel Aéce



É 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 que 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 o método Add que 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 3 - DataList 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 4 - Escrevendo 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.

Artigo desenvolvido utilizando:

* Visual Studio .NET 2002
* .NET Framework 1.0
* Windows XP Professional

Clique aqui para fazer Download do Código.
Israel Aéce

Israel Aéce - Especialista em tecnologias de desenvolvimento Microsoft, atua como desenvolvedor de aplicações para o mercado financeiro utilizando a plataforma .NET. Como instrutor Microsoft, leciona sobre o desenvolvimento de aplicações .NET. É palestrante em diversos eventos Microsoft no Brasil e autor de diversos artigos que podem ser lidos a partir de seu site http://www.israelaece.com/. Possui as seguintes credenciais: MVP (Connected System Developer), MCP, MCAD, MCTS (Web, Windows, Distributed, ASP.NET 3.5, ADO.NET 3.5, Windows Forms 3.5 e WCF), MCPD (Web, Windows, Enterprise, ASP.NET 3.5 e Windows 3.5) e MCT.