É 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:
|
|
<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:
|
|
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.
Curtir isso:
Curtir Carregando...