1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Vb 2008

Discussão em 'Programação' iniciada por SA-SS-A, 30 de Novembro de 2008. (Respostas: 26; Visualizações: 1895)

  1. SA-SS-A

    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: 30 de Novembro de 2008
  2. Henry4

    Henry4 Power Member

    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
     
  3. ribeiro55

    ribeiro55 Power Member

    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.
     
  4. Ruben_Barbosa

    Ruben_Barbosa Power Member

    Código:
    combobox.items.add(label1.text)
    
    experimenta ;)
     
  5. ribeiro55

    ribeiro55 Power Member

    LOL, Ruben Barbosa... tu leste sequer o post original do SA-SS-A ?
     
  6. PNDmartins

    PNDmartins Power Member

    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)
     
  7. Ruben_Barbosa

    Ruben_Barbosa Power Member

    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
     
  8. PNDmartins

    PNDmartins Power Member

    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: 3 de Dezembro de 2008
  9. Ruben_Barbosa

    Ruben_Barbosa Power Member

    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: 3 de Dezembro de 2008
  10. ribeiro55

    ribeiro55 Power Member

    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.
     
  11. PNDmartins

    PNDmartins Power Member

    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: 3 de Dezembro de 2008
  12. ribeiro55

    ribeiro55 Power Member

    Bem visto PNDmartins:
    Desculpa lá SA-SS-A. Já estava way off do sentido original do post.
    Depois de tudo isto, penso que já tenhas mais por onde pegar no teu problema ;)
     
  13. Ruben_Barbosa

    Ruben_Barbosa Power Member

    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
     
  14. pmaster

    pmaster Power Member

    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"?
     
  15. ribeiro55

    ribeiro55 Power Member

    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.
     
  16. PNDmartins

    PNDmartins Power Member

    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.
     
  17. pmaster

    pmaster Power Member

  18. PNDmartins

    PNDmartins Power Member

    =)

    De nada, espero que o código te tenha sido útil :001:
     
  19. pmaster

    pmaster Power Member

    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 :)
     
  20. PNDmartins

    PNDmartins Power Member

    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
    
     

Partilhar esta Página