Vb 2008

SA-SS-A

Power Member
Boa tarde!

Tenho uma combobox com vários serviços (Limpeza cpu, Diagonosticos, etc etc), e quero que quando escolher por exemplo, "Limpeza cpu", apareça o valor em euros desse serviço na label ao lado. Já consegui fazer com que surja o nome do serviço, mas nao estou a sacar como vou ligar o nome ao valor. Isto tudo sem BD!

Código:
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        Label1.Text = ComboBox1.SelectedItem
End Sub
Queria qql coisa como "se valor1 da lista seleccionado, então mostrar "20"".... e por aí fora...

Alguém com ideias ?

Cumps
 
Última edição:
O que eu sugeria era o seguinte:

1- Lês o texto da combo box

2- Comparas o texto que devolve da escolha
Caso Combox.text="reparacao"
val= custo



Isto é uma maneira rápida de fazer, mas tou certo que deve haver maneiras + eficientes de o fazer
 
As comboboxes, tal como as listboxes, possuem DisplayMember (valor para apresentação) e ValueMember (valor do valor de apresentação).

Basta atribuíres a descrição dos serviços no DisplayMember e o valor dos serviços no ValueMember, direitinho como deverá estar na database.

Outra forma é essa que o Henry4 sugeriu. Executas uma query que te vá cheirar o valor de um registo que tenha essa descrição.
 
OMG

Um pequeno aparte: Amigo Ruben.. Explica-me la como é que isso o vai ajudar??


Tal como Ribeiro55 disse, podes usar o .ValueMember e o .DisplayMember, também podes adicionar directamente uma Datatable contendo os valores da base de dados. Para isso usa a propriedade .DataSource = Dt (onde a dt é uma datatable contendo os dados), e de seguida dás na propriedade .displaymember o nome da coluna de onde queres que a combo mostre os dados, e no .valuemember metes o nome da coluna do valor que está "escondido".

Quando queres demonstrar esse valor é so meteres algo do genero:

Código:
label1.text = combobox1.selectevalue.tostring
(muito importante o .tostring senão devolve-te a descricao de uma row)
 
Por acaso não :|

Olhei assim por alto :| mas o que disse está errado.Acontece :lick1:

Aqui em baixo deixo a minha sugestão ;)

Código:
label1.text = combobox1.displaymember or
label1.text = combobox1.valuemember

cumps
 
Lol

Ok, acredito que tenhas cometido um erro, todos comete-mos mas explica-me então porque voltas-te a cometer outro erro?? É que parece que nem te deste ao trabalho de testar o teu código antes de fazeres o post, ou k fizes-te copy/paste de posts anteriores sem saberes do que estás a falar.. posso estar enganado mas é essa a sencação com que fico...

Código:
 Private Dt As New DataTable

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dt.Columns.Add("Id")
        Dt.Columns.Add("Nome")

        Dim i As Integer

        For i = 0 To 9
            Dt.Rows.Add(Dt.NewRow)
            Dt.Rows(Dt.Rows.Count - 1).Item("Id") = i
            Dt.Rows(Dt.Rows.Count - 1).Item("Nome") = "Nome " & i
        Next

        ComboBox1.DataSource = Dt
        ComboBox1.DisplayMember = "Nome"
        ComboBox1.ValueMember = "Id"
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        Label1.Text = ComboBox1.SelectedValue.ToString
    End Sub


Aqui está o código testado, e a funcionar... Inicio o código a criar uma datatable com dados, simulando os dados como se tivessem vindo de uma base de dados. De seguida adiciono os dados necessários a combo.
 
Última edição:
ficas com a sensação errada ;) pk se ele usar o DLA em VB que simplifica mt mais. Não sei se sabes o Que DLA em VB mas vais pesquisar então ;).E Entende isso como quiseres.

Fica So aqui uma Nota Ele pode Trabalhar em vb mt facilmente sem ter de se chatear usando a sua BD em VB que simplifica mt mais. Add project Data Source ;) mas isso não é para todos mas tudo bem.


Cumps
 
Última edição:
Recorres a third party para quê ?
Uses o que usares, label1.text = combobox1.displaymember e label1.text = combobox1.valuemember não te vão funcionar nunca.
É quase como igualar uma colecção a uma string. Simplesmente não funciona. É até absurdo sugerir.

A framework é linda, podes fazer todas e quaisqueres operações de bases de dados com ela.
Para que inventar?

Para além disso, nem com data bindings o combobox1.valuemember te vai devolver o que queres.
combobox1.selectedvalue.tostring talvez já surta o efeito necessário.

E desculpa que te diga,
Código:
Fica So aqui uma Nota Ele pode Trabalhar em vb mt facilmente sem ter de se chatear usando a sua BD em VB que simplifica mt mais. Add project Data Source  mas isso não é para todos mas tudo bem.
trabalhar directamente com a db, sem recorrer a ajudas e mariquices da IDE é que não é para todos. Wizards toda a gente sabe ler e carregar next.
 
Meu amigo ruben

Mais uma vez provas a tua ignorância neste assunto.

Primeiro que tudo, usei um datatable como exemplo, podes usar de tudo para este metodo, até uma sortedlist, ou uma datasource como tanto gostas. Coisa que se percebesses e soubesses usar estas propriedades tinhas compreendido.

Segundo, datasource é para trabalhos rápidos. Tudo o que requer controlo sobre a base de dados a "Sério", não se usa datasource, usam-se stored procedures entre outros metodos, mas pelo k estou a ver, acho que nunca precisas-te de fazer algum trabalho a sério com bases de dados, senão não davas respostas desse genero.

Terceiro, o codigo que deste, nunca na vida vai funcionar (eu testei antes de postar para não fazer figura de urso ao contrario de alguem). Se fores verificar no object browser do vb o que fazem e para que servem as duas propriedades do teu bem dito codigo, vais perceber. Ou talvez não.

Quarto, eu estou a tentar ajudar alguém, em vez de dar becos sem saída e códigos não funcionais.

(desculpa se dei uma resposta muito agressiva, mas não gosto que me chamem de burro (directa ou indirectamente) quando nem sabem do que estão a falar. Btw, este é o meu último post em relação a este assunto porque axo que ja ajudei o "SA-SS-A" com o problema dele.)
 
Última edição:
Meu Ultimo post.

Código:
 trabalhar directamente com a db, sem recorrer a ajudas e mariquices da IDE é que não é para todos. Wizards toda a gente sabe ler e carregar next.

Como eu Disse Ribeiro anteriomente não é para todos
Código:
 Fica So aqui uma Nota Ele pode Trabalhar em vb mt facilmente sem ter de se chatear usando a sua BD em VB que simplifica mt mais. Add project Data Source ;) mas isso não é para todos mas tudo bem.
.

Quanto a ti PNDmartins nem te vou dar mais fio , é que n vale apena até porque tou aqui para ajudar ;) e não para discutir com alguem.
No meu ponto de vista tudo o que eu disse funciona perfeitamente se ele usar o metedo que me referi mas tambem como já o ribeiro disse e mt bem não é para todos.
Porque Next toda a gente sabe fazer ;).
Mas para Concluir eu não chamei burro a ninguem mas tambem não admito que alguem venha feito chico esperto a chamar burro ou a insinua-lo.Porque se essa pessoa supor que eu cometi um erro , que na realidade não é bem assim. Já testei no meu vb e funcionou com o metedo que usei mas tudo bem. Há mts maneira de fazer ou resolver o problema.
Passando Isso a Frente, SA-SS lamento esta discussão no teu post , até porque tu vieste aqui para te esclarecem duvidas e não veres user a picarem-se numa discussão.

Cumps
 
No seguinte postado pelo PNDmartins
Código:
 Private Dt As New DataTable

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dt.Columns.Add("Id")
        Dt.Columns.Add("Nome")

        Dim i As Integer

        For i = 0 To 9
            Dt.Rows.Add(Dt.NewRow)
            Dt.Rows(Dt.Rows.Count - 1).Item("Id") = i
            Dt.Rows(Dt.Rows.Count - 1).Item("Nome") = "Nome " & i
        Next

        ComboBox1.DataSource = Dt
        ComboBox1.DisplayMember = "Nome"
        ComboBox1.ValueMember = "Id"
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        Label1.Text = ComboBox1.SelectedValue.ToString
    End Sub
Alguem me podia dizer se faz favor o que é "Dt"?
 
O nome da instância de DataTable.

Provavelmente daí é que o PNDmartins inventou esse nome: DT, iniciais de DataTable.

Mas como está Dt até podia estar Tia ou Madrinha. É um nome.
 
Resposta

Código:
Private Dt As New DataTable

Dt é o nome que dei á variavel do tipo Datatable, que é uma tabela sem aspecto visual. Ao estilo de uma datagridview mas apenas em código.
 
Vou aproveitar este tema e esclarecer uma duvida que tenho deste tipo tambem se nao se importarem
Código:
Private Sub gestuti_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim conn As MySqlConnection
        Dim inputerror As String = ""

        conn = New MySqlConnection
        conn.ConnectionString = "server=localhost;user id=root; password=a;database=pap;"
        conn.Open()
        Dim sql As String
        Dim dr As MySqlDataReader
        Dim cmd

        sql = "Select  * From relog"
        cmd = New MySqlCommand(sql, conn)
        dr = cmd.ExecuteReader
        While dr.Read
            With Me.ComboBox1
                .Items.Add(dr("username").ToString)
                .ValueMember = (dr("ps").ToString)
            End With
        End While
        dr.Close()

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        TextBox1.Text = (ComboBox1.DisplayMember)
    End Sub
O que acontece é que ele vai sempre buscar o 1º valor da base de dados do campo "ps", eu mudo na combobox o campo user name mas ele dáme sempre o primeiro valor de "ps".

Se alguem me podesse ajudar agradecia :)
 
Ok, primeiro um pequeno concelho. Poupas mais recursos e é mais facil aceder aos dados se trocares este código:

Código:
        Dim sql As String
        Dim dr As MySqlDataReader
        Dim cmd
 
        sql = "Select  * From relog"
        cmd = New MySqlCommand(sql, conn)
        dr = cmd.ExecuteReader
        While dr.Read
            With Me.ComboBox1
                .Items.Add(dr("username").ToString)
                .ValueMember = (dr("ps").ToString)
            End With
        End While
        dr.Close()

Para:

Código:
Dim Conn as new MySqlConnection("server=localhost;user id=root; password=a;database=pap;")
Dim Sql as string = "Select * from Relog"
Dim Dt as new datatable  
Dim Cmd as new mysqlcommand(sql,conn)
 
conn.open()
Dt = cmd.ExecuteNonQuery()
conn.close()

Com este código tens os dados todos numa tabela, em muito menos linhas.

Pelo que veijo no teu código, o erro pode estar em vários sitios. Mas assim derepente o erro que parece ser mais provavel é este:

Código:
.ValueMember = (dr("ps").ToString)

Esta propriedade é do tipo string, ou seja.. sempre que adicionas algo a esta propriedade estás a substituir o valor que lá estava anteriormente. Por outras palavras, pelo teu código o valor que fica na propriedade ha-de ser o ultimo "ps" a ser lido.

Outra coisa é que está propriedade serve de referencia, e deve de ser usada sempre em conjunto com a .datasource, que como estás a adicionar os items 1 a 1, isso não acontece.

Se modificares o teu código para o que te dei, basta depois do que está descrito em cima pores:

Código:
me.combobox1.datasource = Dt
me.combobox1.displaymember = "Nome" 'Este é o valor que vai ser visto na combobox
me.combobox1.valuemember = "ps" 'Este é o valor que está subentendido cada vez que mudas de item.
 
'Este bocado de código é apenas para refrescar os valores senao ao abrires um formulario, ou 'ao fazeres load dos dados ha-de aparecer sempre na textbox algo do genero .rows.etc...
me.combobox1.selectedindex=1
me.combobox1.selectedindex=0
 
  Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        TextBox1.Text = ComboBox1.selectedvalue.tostring
    End Sub
 
Back
Topo