USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Fórum

  Visual Basic .Net
Voltar
Autor Assunto:  Problemas com coleção no Visual Basic.Net
Alex
não registrado
ENUNCIADA !
Postada em 02/06/2006 12:14 hs   
Olá pessoal estou com grandes problemas ao programar classe e coleção no Visual Basic.Net.
Foram criadas duas classes:
- Classe: CLS_Produto; 
- Coleção: COL_Produtos;
- Módulo: CaixaBranca (O CaixaBranca é utilizado para testar os códigos).
Ao realizar o teste no Caixa Branca o mesmo está me retornando a seguinte mensagem de erro:
 
"C:Documents and SettingsabarrosMeus documentosVisual Studio ProjectsAutomoveisAutomoveisCaixaBranca.vb(16): Expression is of type 'Automoveis.COL_Produtos', which is not a collection type."
 
Segue abaixo o código:
 
- Classe:

Option Explicit On

Public Class CLS_Produto

Private mvarIdProduto As Long

Private mvarNome As String

Private mvarIdFabricante As Long

Private mvarIdCor As Long

Private mvarChassi As String

Private mvarDataFabricacao As Date

Private mvarQtdePortas As Integer

Private mvarFabricante As CLS_Fabricante

Private mvarCor As CLS_Cor

Public Property id_produto() As Long

Get

id_produto = mvarIdProduto

End Get

Set(ByVal vData As Long)

mvarIdProduto = vData

End Set

End Property

Public Property nome() As String

Get

nome = mvarNome

End Get

Set(ByVal vData As String)

mvarNome = vData

End Set

End Property

Public Property id_fabricante() As Long

Get

id_fabricante = mvarIdFabricante

End Get

Set(ByVal vData As Long)

mvarIdFabricante = vData

End Set

End Property

Public Property id_cor() As Long

Get

id_cor = mvarIdCor

End Get

Set(ByVal vData As Long)

mvarIdCor = vData

End Set

End Property

Public Property chassi() As String

Get

chassi = mvarChassi

End Get

Set(ByVal vData As String)

mvarChassi = vData

End Set

End Property

Public Property data_fabricacao() As Date

Get

data_fabricacao = mvarDataFabricacao

End Get

Set(ByVal vData As Date)

mvarDataFabricacao = vData

End Set

End Property

Public Property quantidade_portas() As Integer

Get

quantidade_portas = mvarQtdePortas

End Get

Set(ByVal vData As Integer)

mvarQtdePortas = vData

End Set

End Property

Public Property Fabricante() As CLS_Fabricante

Get

If mvarFabricante Is Nothing Then

mvarFabricante = New CLS_Fabricante

mvarFabricante.obterRegistro(Me.id_fabricante)

Fabricante = mvarFabricante

End If

End Get

Set(ByVal vData As CLS_Fabricante)

mvarFabricante = vData

End Set

End Property

Public Property Cor() As CLS_Cor

Get

If mvarCor Is Nothing Then

mvarCor = New CLS_Cor

mvarCor.obterRegistro(Me.id_cor)

Cor = mvarCor

End If

End Get

Set(ByVal vData As CLS_Cor)

mvarCor = vData

End Set

End Property

Public Sub lerRegistro(ByVal prmDados As Object)

id_produto = prmDados("idProduto")

nome = prmDados("Nome")

id_fabricante = prmDados("idFabricante")

id_cor = prmDados("idCor")

chassi = prmDados("chassi")

data_fabricacao = prmDados("dataFabricacao")

quantidade_portas = prmDados("qtdePortas")

End Sub

Public Function obterRegistro(ByVal prmIdentificador As Long)

AbreConexao()

Dim vlCmd As System.Data.OleDb.OleDbCommand

Dim vlRs As System.Data.OleDb.OleDbDataReader

vlCmd = New System.Data.OleDb.OleDbCommand("SELECT * FROM Produtos WHERE idProduto =" & prmIdentificador, vgCon)

vlRs = vlCmd.ExecuteReader()

vlRs.Read()

lerRegistro(vlRs)

vlRs.Close()

vlRs = Nothing

FechaConexao()

End Function

End Class

- Coleção:
Option Explicit On

Public Class COL_Produtos

Private mCol As New System.Collections.Hashtable

Public Function Add(ByVal prmProduto As CLS_Produto) As CLS_Produto

Dim objNewMember As CLS_Produto

objNewMember = New CLS_Produto

objNewMember = prmProduto

mCol.Add(CStr(prmProduto.id_produto), objNewMember)

Add = objNewMember

objNewMember = Nothing

End Function

Public Function obterColecaoRegistros()

AbreConexao()

Dim clsProduto As CLS_Produto

Dim vlCmd As System.Data.OleDb.OleDbCommand

Dim vlRs As System.Data.OleDb.OleDbDataReader

vlCmd = New System.Data.OleDb.OleDbCommand("SELECT * FROM Produtos", vgCon)

vlRs = vlCmd.ExecuteReader()

Do While vlRs.Read

clsProduto = New CLS_Produto

clsProduto.lerRegistro(vlRs)

Me.Add(clsProduto)

Loop

vlRs.Close()

vlRs = Nothing

FechaConexao()

End Function

End Class

- CaixaBranca:

Option Explicit On

Module CaixaBranca

Sub Main()

Dim vlTeste As CLS_Produto

Dim vlTestes As COL_Produtos

Dim i As Long

vlTeste = New CLS_Produto

vlTestes = New COL_Produtos

vlTestes.obterColecaoRegistros()

For Each vlTeste In vlTestes

Debug.WriteLine(vlTeste.id_produto & " - " & vlTeste.nome & " - " & _

vlTeste.Fabricante.nome & " - " & vlTeste.Cor.nome & " - " & _

vlTeste.chassi & " - " & vlTeste.data_fabricacao & " - " & _

vlTeste.quantidade_portas)

Next

vlTeste = Nothing

vlTestes = Nothing

End Sub

End Module

Sem mais,

Aguardo respostas.

Alex.

 

 

 

 

   
caco
Pontos: 2843

SP - BRASIL
Postada em 02/06/2006 20:31 hs            
Olá!
 
Você está cometendo um equívoco na criação dessas classes. Esse erro acontece, como diz na própria descrição, porque sua classe COL_Produtos não é uma coleção e sim um container de um Hashtable, por isso você não pode usar um For Each nela. Você está na verdade armazenando os items nessa Hashtable, então a iteração nos items teria que ser feita nela, tipo:
 
For Each vlTeste In vlTestes.mCol
 
Essa não é a melhor maneira de fazer, eu costumo criar minha coleção derivando da classe CollectionBase, e sobrepondo alguns membros dela pra "tipar" os items de acordo com o objeto que vou armazenar. Exemplo:
 
Imports System
Imports System.Collections
 
Public Class COL_Produtos
   Inherits CollectionBase
 
   Default Public Property Item(index As Integer) As CLS_Produto
      Get
         Return CType(List(index), CLS_Produto)
      End Get
      Set
         List(index) = value
      End Set
   End Property
 
   Public Function Add(value As CLS_Produto) As Integer
      Return List.Add(value)
   End Function
 
   Public Function IndexOf(value As CLS_Produto) As Integer
      Return List.IndexOf(value)
   End Function
 
   Public Sub Insert(index As Integer, value As CLS_Produto)
      List.Insert(index, value)
   End Sub
 
   Public Sub Remove(value As CLS_Produto)
      List.Remove(value)
   End Sub
 
   Public Function Contains(value As CLS_Produto) As Boolean
      Return List.Contains(value)
   End Function
 
End Class
 
Public Class CLS_Produto
 
    Public Sub New(ByVal id As Integer, ByVal nome As String)
        Me.ProdutoId = id
        Me.Nome = nome
    End Sub
 
    Public m_ProdutoId As Integer
    Public m_Nome As String
 
    Public Property ProdutoId() As Integer
        Get
            Return m_ProdutoId
        End Get
        Set(ByVal Value As Integer)
            m_ProdutoId = Value
        End Set
    End Property
 
    Public Property Nome() As String
        Get
            Return m_Nome
        End Get
        Set(ByVal Value As String)
            m_Nome = Value
        End Set
    End Property
 
End Class
 
Pra armazenar e iterar os items da coleção:
 
Dim produtos As New COL_Produtos
 
For i As Integer = 1 To 10
    produtos.Add(New CLS_Produto(i, "Produto" & i))
Next
 
For Each produto As CLS_Produto In produtos
    Debug.WriteLine(produto.Nome)
Next
 
Pra lista os items você pode fazer assim também, já que com CollectionBase permite a criação da propriedade Item indexada.
 
For i As Integer = 0 To produtos.Count - 1
    Debug.WriteLine(produtos(i).Nome)
Next
 
Espero ter ajudado!

Messenger: vbdev@uol.com.br

     
Alex
não registrado
ENUNCIADA !
Postada em 06/06/2006 10:00 hs   
Ajudou sim!!!! Obrigado...
   
Página(s): 1/1    


Seu Nome:

Seu eMail:

ALTERAR PARA MODO HTML
Mensagem:

[:)] = 
[:P] = 
[:(] = 
[;)] = 

HTML DESLIGADO

     
 VOLTAR

  



CyberWEB Network Ltda.    © Copyright 2000-2024   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página