none
Selecionar ComboBox com valores carregados do Banco de Dados RRS feed

  • Pergunta

  • Olá Senhores,

     

    Tenho uma ComboBox que é carrega pelo banco de dados na seguinte forma...

          DataTable dt = myBd.directQuery("SELECT * FROM EQTO");
          comboEqtoPref.Items.Clear(); // limpa combo
          comboEqtoPref.DataSource = dt; // atribue o dataTable
    
          comboEqtoPref.DisplayMember = "NOME"; // o nome d equipamento é exibido pelo usuário
          comboEqtoPref.ValueMember = "ID_EQTO"; // seu id fica como valor... para a hr q salvar no BD
    

     

    Então salvo no BD o 'ValueMember' do meu ComboBox (Ex.: 01,02...) ... até ai sem probles...

    Agora vem a minha dúvida, ao carregar a tela para editar , carrego a ComboBox novamente com o mesmo código que postei ai em cima... e tento selecionar minha ComboBox com o seu  ValueMember que está salvo na minha tabela instalação que fica como abaixo...

    // Aqui já tenho toda minha janela desenhada, inclusive com o comboBox carregado com os Eqtos (com o cod acima) do BD e agora vou carregar os dados da minha instalação...
    
    
    DataTable dt = myBd.directQuery("SELECT * FROM INSTALACAO");
    
          txt_inst_nome.Text = dt.Rows[0]["NOME"].ToString(); // NOME DA INSTALAÇÃO
         
          comboEqto.SelectedValue = dt.Rows[0] ["ID_TIPO_EQTO_PREF"].ToString(); // AQUI ESTÁ O PROBLEMA, POIS NÃO SELECIONA MEU 'ValueMember' QUE ESTÁ SALVO NO BD.
    

    No caso não seleciona meu ComboBox pelo ValueMember.

    Por isso peço a ajuda de vocês..

     

    Abraços

     

     


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    terça-feira, 7 de dezembro de 2010 12:56

Respostas

  • Tipo em java eu faço o seguinte

    Preencho a table com um comando Select, onde eu coloco as restrições e a ordenação dos valores, ai como vc quer no combo só joga a table ja preenchida na ordem para ser carregada no combo

    • Sugerido como Resposta JeffersonDF quinta-feira, 9 de dezembro de 2010 18:02
    • Marcado como Resposta Toniolo quinta-feira, 9 de dezembro de 2010 18:04
    quinta-feira, 9 de dezembro de 2010 13:51
  • então com Select Top vc indica o indice que ele vai começar o filtro

    ou seja apartir do 108


    Então Daniel,

    Consegui resolver meu problema.

    Na verdade seguimos a sua dica e montamos uma nova string sql para recarregar o combobox e ordenar o DataTable dentro do DataSource.

    select * from EQUIPAMENTO ORDER BY<br/>
    CASE WHEN [ID_EQUIPAMENTO] = 'ID_EQTO_QUE_EU_SELECIONO' THEN 0 ELSE 1 END, [ID_EQUIPAMENTO]
    

    Valeu pela ajuda Daniel e de todos que postaram ae.

    =)

    Saudações


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    • Marcado como Resposta Toniolo quinta-feira, 9 de dezembro de 2010 17:56
    quinta-feira, 9 de dezembro de 2010 17:55

Todas as Respostas

  • Nada Luis...

     

    Não seleciona a combo...

     

    Saudações


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    terça-feira, 7 de dezembro de 2010 13:19
  • cara no primeiro codigo ta
    comboEqtoPref
    

    e no segundo ta

    comboEqto é isso mesmo?

    se a resposta foi útil, classifique :)
    ate mais,

    Rodrigo Soria
    terça-feira, 7 de dezembro de 2010 15:07
  • É isso mesmo...

     

    Na verdade esta combo carrega as mesma informmações que a comboEqtoPref , mais não consigo setar o ValueMember que vem do banco de dados.

    tentei foreach já ... SelectdValue .. e nada...

     

    Abraços


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    terça-feira, 7 de dezembro de 2010 15:36
  • estranho..

    o combo esta com valores certinho tanto value como texto?

    tem algum evento atrelado a ele?


    se a resposta foi útil, classifique :)
    ate mais,

    Rodrigo Soria
    terça-feira, 7 de dezembro de 2010 15:39
  • Estão com os valores corretos...

    Por que eles vem direto do DataTable que é carregado por valores vindo do Banco de dados.

       comboEqtoPref.DataSource = dt; // atribue o dataTable
    
       comboEqtoPref.DisplayMember = "NOME"; // o nome d equipamento é exibido pelo usuário
       comboEqtoPref.ValueMember = "ID_EQTO"; // seu id fica como valor... para a hr q salvar no BD
    
    

    enão tem evento, pois o usuário só escolhe um eqto pelo nome e eu gravo seu Id no BD.

     

    Saudações


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    terça-feira, 7 de dezembro de 2010 15:46
  • cara muito estranho.. fiz um teste da mesma maneira que vc fez e funciona normal..

    sera que nao tem nenhum espaco nesse id que vc ta trazendo do banco?

    roda esse codigo aqui ve se o id que vc ta tentando seleciona existe no combo

    foreach (DataRowView item in comboEqtoPref.Items)
    {
      if (item.Row[0] == dt.Rows[0]["ID_TIPO_EQTO_PREF"].ToString())
       {
        MessageBox.Show("Existe");
        break;
       }
    }
    


    se a resposta foi útil, classifique :)
    ate mais,

    Rodrigo Soria
    terça-feira, 7 de dezembro de 2010 16:37
  • Tenta fazer cast pra int na hora de passar o selectedValue

     

     

     comboEqto.SelectedValue = Convert.ToInt32(dt.Rows[0] ["ID_TIPO_EQTO_PREF"
    
    ].ToString());
    

     

     

    Mas verifica se você preencheu este comboEqto com displayMember e ValueMember.

    terça-feira, 7 de dezembro de 2010 17:36
  • Nada Pessoal,

     

    O interessante é que SelectValue fica com o valor null.

    e os meus valores que exibem no ComboBox vindos do BD ficam todos dentro da propriedade DataSource, que é a unica propriedade que contem valor no meu objeto.

     

    Abraços


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    terça-feira, 7 de dezembro de 2010 17:47
  • Toniolo, eu insisto, você preenche esse combo com ValueMember e DisplayMember?

     

    Porque você faz isso no combo comboEqtoPref , mas não vi você fazer o mesmo no comboEqto , o qual você está tentando utilizar o SelectedValue.


    Verifique isto. Parece que você atribiu ValueMember em um combo, mas tenta utilizar SelectedValeu em outro combo. Dá uma revisada ae.

    terça-feira, 7 de dezembro de 2010 17:57
  • Olá Daniel,

     

    Seguinte a comboEqto é carrega da mesma forma que a comboEqtoPref , como mostrei ali em cima.

    Na verdade até agora oq verifiquei que na verdade eu tenho q mexer no DataTable que está dentro do datasourse na combobox para conseguir alterar a ordem dos

    itens da combo, e oviamente setar a que eu quero.

    Mais continuo com o problema, se alguém tiver um método mais fácil...

     

    Abraços


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    quinta-feira, 9 de dezembro de 2010 10:45
  • Alguém tem alguma sugestão????

     

    Saudações!


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    quinta-feira, 9 de dezembro de 2010 12:41
  • Estou com o mesmo problema.

    Preencho um combobox com datasource, depois dou um displaymember e value member pra ele. Após isso nao consigo selecionar de jeito nenhum o elemento que eu quero, pq na verdade nao existem elementos, só o datasource com as rows com as informaçoes que eu preciso.

    Como o Renan disse, parece que o elemento que fica selecionado na combo é sempre o primeiro elemento do datasource, entao tem q ficar manipulando o datatable e jogando no datasource, ou fazendo um cast do datasource para datatable e ficar manipulando ele.

    Mas isso eh muito trabalhoso!

    Ninguem sabe um jeito mais facil de trabalhar com datasource??

    quinta-feira, 9 de dezembro de 2010 12:57
  • Será que não daria certo, vc Fazer um For para percorrer toda a table e dentro dele ir adicionando as rows no combo?
    quinta-feira, 9 de dezembro de 2010 13:45
  • nao, ela se ordena sozinha.

    Tem um comando sort para o dataview, ele ordena.

    Mas esse sort parece que nao resolve o problema porque parece q so da pra ordenar pelo nome da coluna da tabela em ascendente ou decrescente. Precisamos deixar como o primeiro elemento do datatable, o elemento X (que eh uma das rows la)

    quinta-feira, 9 de dezembro de 2010 13:47
  • por exemplo, se popular um datatable row por row, com os valores da primeira coluna 1, 2, 3, 4, 5, 6 e preencher com 6,5,4,3,2,1 ele mostra do mesmo jeito no combo : 1,2,3,4,5,6
    quinta-feira, 9 de dezembro de 2010 13:49
  • Tipo em java eu faço o seguinte

    Preencho a table com um comando Select, onde eu coloco as restrições e a ordenação dos valores, ai como vc quer no combo só joga a table ja preenchida na ordem para ser carregada no combo

    • Sugerido como Resposta JeffersonDF quinta-feira, 9 de dezembro de 2010 18:02
    • Marcado como Resposta Toniolo quinta-feira, 9 de dezembro de 2010 18:04
    quinta-feira, 9 de dezembro de 2010 13:51
  • Hello 

    @JeffersonDF

    @Toniolo

    Na verdade qual e voce problema?

    Voce tem a ceteza que a informacao esta a ser salva na tabela?

    Se voce quer selecionara a informacao que foi salva voce tem de fazer uma query(pesquiza com este novo valor salvo) deste novo valor.

    Eu nao percebi o que voces queres fazer. Deixa-me saber.


    Just Be Humble Malange!
    quinta-feira, 9 de dezembro de 2010 14:42
    Moderador
  • fala Toniolo bom

    eu não entendo mto d datatables e afins uso mais collections então oq tu podes tentar fazer é pegar a linha e a coluna com o valor do ID_EQTO relacionado a este valor, pegar o valor dessa linha e atribuir a propriedade
    SelectedIndex do comboBox faça isso no load ou no shown do teu form vai ficar algo assim

         int index = Convert.ToInt32(dt.Rows[0]["ID_TIPO_EQTO_PREF"].ToString());
         TeuCombo.SelectedIndex = index;


    Att Edney Desenvolvedor C#, WindowsForms, Asp.Net WebForms, Asp.Net MVC
    quinta-feira, 9 de dezembro de 2010 15:50
  • Seguinte Malange,

    Faço uma pesquisa no banco de dados para buscas todos os meus tipos de equipamentos na tabela Eqto.
    Então retorno esta pesquisa num DataTable (dt) e o insiro num ComboBox, como pode ver no código abaixo:

    dt = myBd.directQuery("SELECT ID_TIPO_EQTO, NOME FROM TIPO_EQTO"); // Faço um select no meu BD e retorno todos os Eqto no DataTable
           
          comboEqtoPref.DataSource = dt; // Adiciono o DataTable no Combo
          comboEqtoPref.DisplayMember = "NOME"; // exibe o nome
          comboEqtoPref.ValueMember = "ID_TIPO_EQTO"; // guarda o id doEqto (1,2,3,4...)
          comboEqtoPref.SelectedIndex = -1;
    

    Até Aqui tudo bem...

    Então esta pagina que tem o comboBox(acima) carregado do banco de dados, aguarda o usuário seleciona um eqto no comboBox(comboEqtoPref), e ao clicar em
    salvar, ai é salvo o 'ValueMember' no banco de dados (no caso 1 ou2 ou 3...).

    Só que ao carregar esta pagina novamente... eu não consigo setar qual "item" no comboBox(comboEqtoPref) o usuário salvou.
    Tentei deste jeito abaixo mais não obtive sucesso.

    DataTable dt = myBd.directQuery("SELECT * FROM LOTE WHERE ID_LOTE ="+ ID_Lote); // Faço um select no meu BD e carrego oque o usuário acabou de salvar nesta tabela 'LOTE'
    
    comboEqtoPref.SelectedValue = dt1.Rows[0]["ID_TIPO_EQTO_PREF"].ToString(); // Aqui eu tentaria setar qual item o usuário salvou no BD(valueMenber)
    

    Seria esta a minha dúvida, não consigo setar um item no comboBox quando o memso é carregado por um Datatble.

    Saudações
    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    quinta-feira, 9 de dezembro de 2010 15:55
  • Voce tem de carregar a sua combobox denovo, so assim faz sentido.

    E pra voce setar tem de estar aqui: comboEqtoPref.ValueMember. O mesmo rocedimento que fizeste pra carregar a informacao da tabela EQTO.

    Voce tem de carregar agora pra tabela LOTE onde esta o novo valor enserido.




    Just Be Humble Malange!
    quinta-feira, 9 de dezembro de 2010 16:06
    Moderador
  • Tipo em java eu faço o seguinte

    Preencho a table com um comando Select, onde eu coloco as restrições e a ordenação dos valores, ai como vc quer no combo só joga a table ja preenchida na ordem para ser carregada no combo


    Daniel,

    o que voce disse faz todo o sentido e acho que seria uma solução, mas tem como no select fazer com que tal ID seja o primeiro na ordem da minha tabela? Por exemplo quero uma tabela ordenada por IDs, mas o primeiro elemento tem que ser o ID "108" ?

    isso resolveria.

    quinta-feira, 9 de dezembro de 2010 16:12
  • PROBLEMA:

     

    Selecionar item no combobox, quando ele é carregado com um datasource = "tabela".

     

    O problema é este.

    Não conseguimos setar o item atraves de nenhuma propriedade, porque aparentemente o combobox nao tem ITENS.

    Parece que o combo só tem o datasource com as rows, que podem ser ordenadas e filtradas.

    Nao conseguimos setar o selectedvalue, selecteditem, selectedindex pois eles sempre permanecem NULL.

    quinta-feira, 9 de dezembro de 2010 16:15
  • Voce tem de carregar a sua combobox denovo, so assim faz sentido.

    E pra voce setar tem de estar aqui: comboEqtoPref.ValueMember. O mesmo rocedimento que fizeste pra carregar a informacao da tabela EQTO.

    Voce tem de carregar agora pra tabela LOTE onde esta o novo valor enserido.




    Just Be Humble Malange!


    Sim eu a carrego a minha combobox(comboEqtoPref) de novo.

     

    Só que dai eu quero setar um item nesta combobox(comboEqtoPref), pelo seu 'ValueMenber'.

    Esta seria minha dúvida.

     

    Saudações Malange


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    quinta-feira, 9 de dezembro de 2010 16:15
  • Jefferson

    Os valores que vc precisa pegar estão aleatórios ou é tudo alinhado apartir do ID108?

    quinta-feira, 9 de dezembro de 2010 16:22
  • Aleatórios. Os valores variam de 1 a 500 com varios buracos nesse intervalo.

    (só para constar pessoal, eu e o Toniolo estamos tentando resolver o mesmo problema, resolvendo um dos 2 resolve os 2)

    quinta-feira, 9 de dezembro de 2010 16:28
  • Mas não tem nenhuma restrição? pq se fosse tudo apartir do 108, por exemplo 108,109...

    vc poderia usar o Select TOP

    se não houver nenhuma restrição, axo q vai ter q usar varios filtros oq seria um trabalhão dependendo o tanto que vc tiver q carregar

    quinta-feira, 9 de dezembro de 2010 16:29
  • É quase isso.

    O select top pelo que eu entendi retorna só ate aquele numero especificado.

    Nos precisamos que TODOS os rows continuem a ser exibidos, mas que o ROW[0] seja o 108.

    O resto nao interessa a ordem.

     

    quinta-feira, 9 de dezembro de 2010 16:34
  • então com Select Top vc indica o indice que ele vai começar o filtro

    ou seja apartir do 108

    quinta-feira, 9 de dezembro de 2010 16:35
  • Por exemplo Daniel...

    Na combo eu tenho...

    __

    1

    2

    105*

    108

    __

    Selecionei o '108' ... dai a nova sequencia ficaria....

    __

    105

    1

    2

    108

    __

     

    Saudações


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    quinta-feira, 9 de dezembro de 2010 16:37
  • então vc quer e mude a ordem dos valores do combo quando eles forem selecionados?
    quinta-feira, 9 de dezembro de 2010 16:40
  • Isto,

    A gente quer muda a ordem do DataTable que está dentro do comboBox, no caso se eu tiver selecionado o value '108 ' ele vai exibir assim
     na combobox.

    __

    108

    1

    2

    105

    __


    Entendeu?
    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    quinta-feira, 9 de dezembro de 2010 16:44
  • humm, agora intendi

    oq vc deve fazer ja não sei, sou novo em c# mas a idéia é que vc vai ter q na hora q o cara selecionar o campo, ou o campo perder o foco ja dar um refresh e recarregar a table, sendo que a primeira linha vai receber o valor de um Select + - assim

    Select * from Tabela Where ID = "cbo.SelectedValue"

    quinta-feira, 9 de dezembro de 2010 16:49
  • Certo...

     

    Mais ai eu vou receber no meu combo só o '108', tb já tentei isso....

     

    =/

     

     


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    quinta-feira, 9 de dezembro de 2010 16:52
  • PROBLEMA:

     

    Selecionar item no combobox, quando ele é carregado com um datasource = "tabela".

     

    O problema é este.

    Não conseguimos setar o item atraves de nenhuma propriedade, porque aparentemente o combobox nao tem ITENS.

    Parece que o combo só tem o datasource com as rows, que podem ser ordenadas e filtradas.

    Nao conseguimos setar o selectedvalue, selecteditem, selectedindex pois eles sempre permanecem NULL.

    Este é o nosso problema...

    Mais alguma sugestão...


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    quinta-feira, 9 de dezembro de 2010 16:56
  • então provavelmente o combo não esta sendo carregado, ou esta?

    se não tiver sendo carregado tenta fazer um for para inserir os campos da table no combo

    quinta-feira, 9 de dezembro de 2010 17:17
  • então com Select Top vc indica o indice que ele vai começar o filtro

    ou seja apartir do 108


    Então Daniel,

    Consegui resolver meu problema.

    Na verdade seguimos a sua dica e montamos uma nova string sql para recarregar o combobox e ordenar o DataTable dentro do DataSource.

    select * from EQUIPAMENTO ORDER BY<br/>
    CASE WHEN [ID_EQUIPAMENTO] = 'ID_EQTO_QUE_EU_SELECIONO' THEN 0 ELSE 1 END, [ID_EQUIPAMENTO]
    

    Valeu pela ajuda Daniel e de todos que postaram ae.

    =)

    Saudações


    Renan Toniolo Rocha
    www.renantoniolo.hdfree.com.br
    • Marcado como Resposta Toniolo quinta-feira, 9 de dezembro de 2010 17:56
    quinta-feira, 9 de dezembro de 2010 17:55
  • ^^

    Que bom que vc conseguiu

    AbraçO

    quinta-feira, 9 de dezembro de 2010 18:01