COMBOBOX (ITEMDADATA)
Se sua aplicação não tiver um grande volume de dados, sugiro vc trabalhar com ENtity Framework, vc terá uma série de vantagens.
Dá umas olhadas nos tutoriais e videos, vc vai ver como vale a pena. vai se livrar de Strings de SQL dentro de seu código.
Dá umas olhadas nos tutoriais e videos, vc vai ver como vale a pena. vai se livrar de Strings de SQL dentro de seu código.
Pessoal, ta meio perdido aqui. seguindo o exemplo do macoratti, criei a classe pública:
Public Class MeuItemData
Public Valor As Object
Public Descricao As String
Public Sub New(ByVal NovoValor As Object, ByVal NovaDescricao As String)
Valor = NovoValor
Descricao = NovaDescricao
End Sub
Public Overrides Function ToString() As String
Return Descricao
End Function
End Class
CARREGUEI O COMBO:
Carregar_Banco()
Sqlcmd = New SqlCommand([Ô]select descgru,idgru from cce_grupos order by descgru[Ô], Cnn)
Dr = Sqlcmd.ExecuteReader
cmbgrupos.Items.Clear()
While (Dr.Read())
[ô]cmbgrupos.Items.Add(Dr([Ô]descgru[Ô]))
[ô]cmbgrupos.ValueMember = Dr([Ô]idgru[Ô])
cmbgrupos.Items.Add(New MeuItemData(Dr([Ô]idgru[Ô]), Dr([Ô]descgru[Ô])))
End While
Dr.Close()
Cnn.Close()
Cnn.Dispose()
MAS AO PASSAR O SELECT, EM UMA OUTRA FUNÇÃO, DIZ QUE [Ô]MEMBRO PÚBLICO, MeuItemData não encontrado. o que esta faltando ?:
Sql = [Ô]select desccampo,idcampo from cce_campos where idgru = [Ô] & cmbgrupos.SelectedItem.MeuItemData.Valor & [Ô] order by desccampo [Ô]
Sqlcmd = New SqlCommand(Sql, Cnn)
Dr = Sqlcmd.ExecuteReader
Pois a idéia de guardar esses valores no combo, são para usar em filtros, em outras funções ou objetos, e neste caso a classe não fica disponÃvel ?
Public Class MeuItemData
Public Valor As Object
Public Descricao As String
Public Sub New(ByVal NovoValor As Object, ByVal NovaDescricao As String)
Valor = NovoValor
Descricao = NovaDescricao
End Sub
Public Overrides Function ToString() As String
Return Descricao
End Function
End Class
CARREGUEI O COMBO:
Carregar_Banco()
Sqlcmd = New SqlCommand([Ô]select descgru,idgru from cce_grupos order by descgru[Ô], Cnn)
Dr = Sqlcmd.ExecuteReader
cmbgrupos.Items.Clear()
While (Dr.Read())
[ô]cmbgrupos.Items.Add(Dr([Ô]descgru[Ô]))
[ô]cmbgrupos.ValueMember = Dr([Ô]idgru[Ô])
cmbgrupos.Items.Add(New MeuItemData(Dr([Ô]idgru[Ô]), Dr([Ô]descgru[Ô])))
End While
Dr.Close()
Cnn.Close()
Cnn.Dispose()
MAS AO PASSAR O SELECT, EM UMA OUTRA FUNÇÃO, DIZ QUE [Ô]MEMBRO PÚBLICO, MeuItemData não encontrado. o que esta faltando ?:
Sql = [Ô]select desccampo,idcampo from cce_campos where idgru = [Ô] & cmbgrupos.SelectedItem.MeuItemData.Valor & [Ô] order by desccampo [Ô]
Sqlcmd = New SqlCommand(Sql, Cnn)
Dr = Sqlcmd.ExecuteReader
Pois a idéia de guardar esses valores no combo, são para usar em filtros, em outras funções ou objetos, e neste caso a classe não fica disponÃvel ?
Pessoal, na questão acima, tirei a propriedade [Ô]selecteditem.meuitemdata.valor[Ô] , e passei direto [Ô]selecteditem.valor[Ô], ai deu certo. Porém, a propriedade valor que foi criada na classe, quando digito o [Ô]objeto.[Ô] , não aparece disponÃvel como as demais, mas funciona.. é isso mesmo ?, ela não aparece na lista porque não é nativa do combo, neste caso. ?
Dá uma olhada de como funciona o valueMember
https://msdn.microsoft.com/pt-br/library/system.windows.forms.listcontrol.valuemember(v=vs.110).aspx
https://msdn.microsoft.com/pt-br/library/system.windows.forms.listcontrol.valuemember(v=vs.110).aspx
Olha cara, sinceramente eu acho que vc tá perdendo tempo, de repente vc está tentando programar em VB.NET com cabeça de VB6.
vou tentar adequar seu código aqui:
CRIA A CLASSE PARA SUA TABELA
PRA RECUPERAR O ID
vou tentar adequar seu código aqui:
CRIA A CLASSE PARA SUA TABELA
Public Class cce_grupos
Public Property idgru As Int32
Public Property descgru As String
End Class
Carregar_Banco()
Dim Registros As List(Of cce_grupos) = New List(Of cce_grupos)
Sqlcmd = New SqlCommand([Ô]select descgru,idgru from cce_grupos order by descgru[Ô], Cnn)
Dr = Sqlcmd.ExecuteReader
While (Dr.Read())
Dim novoItem As cce_grupos = New cce_grupos()
novoItem.idgru = Dr([Ô]idgru[Ô]))
novoItem.descgru = Dr([Ô]descgru[Ô]))
Registros.Add(novoItem)
End While
Dr.Close()
Cnn.Close()
Cnn.Dispose()
ComboBox1.DataSource = Nothing
ComboBox1.DataSource = Registros
ComboBox1.DisplayMember = [Ô]descgru[Ô]
ComboBox1.ValueMember = [Ô]idgru[Ô]
End Sub
PRA RECUPERAR O ID
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If (ComboBox1.SelectedValue = Nothing) Then Exit Sub
MessageBox.Show(ComboBox1.SelectedValue.ToString())
End Sub
sim, estou com essa dificuldade , com a cabeça em vb6 mesmo, mas vou chegar la... agradeço muito sua ajuda. Na questão acima, reparei que ele jogou essa função no meu form:
Private Function MeuItemData(p1 As Object) As Integer
Throw New NotImplementedException
End Function
só ai funcionou, porque a classe, eu havia criado um novo class module. Vou tentar readaptar conforme vc passou.
Private Function MeuItemData(p1 As Object) As Integer
Throw New NotImplementedException
End Function
só ai funcionou, porque a classe, eu havia criado um novo class module. Vou tentar readaptar conforme vc passou.
Copia esse ultimo código que coloquei, vai dar certinho.
esse MeuItemData é POG lá do macoratti. kkkk
esse MeuItemData é POG lá do macoratti. kkkk
entendi... vou fazer isso, e posto o resultado... Uma outra dúvida, sobre datareader, a maneira correta de verificar se ele retornou registros, seria DR. read ou Dr.hasrows ?, percebi que se tem apenas 1 registro no select, e uso o hasrows, parece que da falha..
Dá o Read() mesmo e passa os dados sempre para o objeto como está no ultimo código.
Ai vc testa a quantidade de registros pelo Objetos usando Registros.Count ( depois do while é claro )
Ai vc testa a quantidade de registros pelo Objetos usando Registros.Count ( depois do while é claro )
Citação:Pessoal, na questão acima, tirei a propriedade [Ô]selecteditem.meuitemdata.valor[Ô] , e passei direto [Ô]selecteditem.valor[Ô], ai deu certo. Porém, a propriedade valor que foi criada na classe, quando digito o [Ô]objeto.[Ô] , não aparece disponÃvel como as demais, mas funciona.. é isso mesmo ?, ela não aparece na lista porque não é nativa do combo, neste caso. ?
Sim, está correto. A propriedade [Ô]valor[Ô] não apareceu quando você digitou-a na IDE porque o selecteditem é do tipo object, e, nesse caso, precisaria de uma conversão. Ex:
dim valor = CType(selecteditem, MeuItemData).Valor
Tópico encerrado , respostas não são mais permitidas