none
Escolhendo item em uma combobox RRS feed

  • Pergunta

  • Olá,

    Eu tenho uma base de dados que é "DataSource" de uma combobox. Os valores de um dos campos dessa base - no caso, "Nome" - aparecem nesse controle. Quando eu insiro um novo objeto em minha base, os "Nome"s são atualizados automaticamente na Combobox conforme o previsto.

    Combo.DataSource = From Nome In d.Coefs
                               Select Nome
    
     Combo.DisplayMember = "Nome"

    No caso, "d" é meu datacontext, "Coefs" é uma das tabelas e "Combo" é o meu Combobox.

    O problema que encontro se dá pela minha necessidade em selecionar, nessa Combobox, o último objeto adicionado à base de dados logo após a sua adesão à base. Eu realmente não sei como proceder. O que eu estava tentando era algo nesse sentido:

    Combo.SelectedItem = From Nome In Combo.Items
                         Where Nome.Nome = ref
                         Select Nome

    Onde "ref" é o valor do "Nome" (uma string) que acabou de ser inserido na base.

    Esse código acima é apenas um exemplo, caso a solução seja bastante distinta, podem mandar. Outra coisa que eu já tentei - e que funciona - é a utilização de um parâmetro auxiliar com auto-incremento onde eu colocaria minha tabela em ordem descendente de acordo com esse parâmetro, mas fica esteticamente bem ruim. Ideias ? Agradeço desde já.

    Att,

    Ricardo Scheufele


    quinta-feira, 9 de janeiro de 2014 17:11

Respostas

  • Olá,

    Resolvi o problema fazendo isso. Mas poste sua resposta, se quiser, estou bem curioso.

    Combo.DataSource = From Nome In d.Coefs
                       Order By Nome.Nome
                       Select Nome
    
    
    Dim obje = From Nome In Combo.Items Where Nome.Nome = ref Select Nome.Nome
    
    For Each element In obje
          Combo.SelectedValue = element
    Next

    Valeu por tudo.

    Att,

    Ricardo S.

    • Marcado como Resposta themartians sábado, 11 de janeiro de 2014 15:15
    sexta-feira, 10 de janeiro de 2014 12:48
  • Olá Ricardo,

    me desculpe, eu estava com a cabeça no componente DropDownList (o combo box do asp.net), esse componente tem o Value, ou seja, é possível adicionar um value e um text para o componente.

    Mas seguindo a mesma lógica criei o código abaixo que funcionou perfeitamente também, de uma olhada:

     ''INSERINDO VALORES NO COMBO
            ComboBox1.Items.Add("A")
            ComboBox1.Items.Add("B")
            ComboBox1.Items.Add("D")
            ComboBox1.Items.Add("E")
    
    
            Dim aux(ComboBox1.Items.Count - 1 + 1) As String ''DECLARANDO ARRAY COM TAMANHO DO COMBO +1
    
            For i = 0 To ComboBox1.Items.Count - 1  'Criando uma cópia do combo dentro do array antes de adicionar o próximo valor no combo
                aux(i) = ComboBox1.Items(i)
            Next
    
            ComboBox1.Items.Add("C") 'ADICIONANDO PRÓXIMO VALOR AO COMBO
            aux(ComboBox1.Items.Count - 1) = ComboBox1.Items(ComboBox1.Items.Count - 1) ''ADICIONANDO NO ARRAY O ULTIMO VALOR ADICIONADO NO COMBO
    
    
            ComboBox1.Sorted = True 'DEIXANDO O COMBO EM ORDEM ALFABÉTICA, OU SEJA, O VALOR "C" NÃO SERÁ MAIS O ULTIMO
    
            'AGORA O CÓDIGO PARA VERIFICAR QUAL O ULTIMO ITEM ADICIONADO
            'VOU COMPARAR O COMBO COM O ARRAY E O PRIMEIRO ITEM DO COMBO QUE FOR DIFERENTE DO ARRAY É O ULTIMO ADICIONADO
            For i = 0 To ComboBox1.Items.Count - 1
                If aux(i) <> ComboBox1.Items(i) Then
                    ComboBox1.SelectedIndex = i
                    Exit Sub 'QUANDO ELE ENCONTRA EU ENCERRO A FUNÇAO, PORQUE SE ELE NÃO ENCONTRA ALGUM DIFERENTE QUER DIZER QUE O ULTIMO ITEM INSERIDO JÁ ESTA EM ORDEM ALFABÉTICA
                End If
            Next
    
            ''CASE ELE NÃO ENCONTRE NENHUM DIFERENTE EU SELECIONO O ULTIMO VALOR DO COMBO
            ComboBox1.SelectedIndex = ComboBox1.Items.Count - 1

    Wennder



    sábado, 11 de janeiro de 2014 04:49

Todas as Respostas

  • Olá Ricardo,

    me desculpa se eu não entendi sua pergunta, mas, veja abaixo a linha de código para selecionar o ultimo valor inserido em um combobox.

     Combo.SelectedIndex = Combo.Items.Count() - 1;

    Espero ter ajudado.

    Wennder

    quinta-feira, 9 de janeiro de 2014 17:59
  • Olá,

    Obrigado pela resposta Wennder, mas não é isso não, cara. O que eu gostaria é de saber o último valor que foi adicionado. No caso, quando eu digo valor, eu me refiro ao último valor no parâmetro "Nome" da minha db.

    Por exemplo, eu tenho na minha base:

    Nome **********Peso********Densidade

    Ferro************1 *************50

    Cobre************0.5 ***********10

    *Estou chutando esses valores.

    O que eu faço em minha combobox, pro enquanto, é colocar os valores Ferro, Cobre e por aí vai. Pela ordem que eu coloquei (alfabética por nome) fica: Cobre, Ferro. Digamos que eu adicione por outros meios o material.

    Estanho**********30**************8

    Na minha combobox, aparecem agora: Cobre, Estanho e Ferro. 

    Isso é tranquilex, o que eu estou me batendo é colocar como SelectedItem, logo após a adição do último valor (no caso, Estanho), o valor "Estanho". Ou seja, a ordem da lista é alfabética, mas logo após adicionar um item, ele deve ser o meu "Selected Item". Ficou mais claro ? Valeu pela dica.

    Att,

    Ricardo Scheufele




    • Editado themartians quinta-feira, 9 de janeiro de 2014 18:20 Formatação
    quinta-feira, 9 de janeiro de 2014 18:17
  • Ola novamente Ricardo,

    veja se eu entendi,

    VALORES NO COMBO:

    cobre

    estanho

    ouro

    é adicionado um outro valor no combo, por exemplo 'ferro', este viria na ordem antes de ouro, mas, você queR que o 'ouro' fique selecionado. isso?

    Se for isso, tente fazer assim:

    *não vou colocar código, somente a ideia, se precisar de ajuda com o código é só falar.

    Carregue o valor value do seu combo com o id da sua tabela e continue carregando o text do combo do jeito que está fazendo.

    Quando atualizar o combo deixe o selectedValue = max(id) da tabela.

    Conseguiu entender? ou melhor dizendo, eu consegui entender a dúvida? rs

    Wennder




    quinta-feira, 9 de janeiro de 2014 18:34
  • Olá,

    Não, cara, mas é quase isso. Se, no seu exemplo, eu adicionar 'Ferro', quem deve aparecer como item selecionado é o 'Ferro'. O último item a adicionado deve ser selecionado. Eu tento fazer isso através da seleção do último parâmetro "Nome" selecionado. Por exemplo, veja o que tentei fazer - eu acho, já deletei e refiz muita coisa:

    Dim teste = From Nome In Combo.Items Where Nome.Nome = ref Select Nome

    Combo.SelectedItem = teste
    Ou, ainda:

    Combo.SelectedItem = From Nome In Combo.Items Where Nome.Nome = ref Select Nome

    Nesse exemplo, "ref" é o último parâmetro "Nome" adicionado. Debuggando, o valor de teste fica certinho, mas a igualdade não. No segundo caso, ele selecionada nada - o famoso "selecionada". Valeu novamente.

    Att,

    Ricardo Scheufele

    quinta-feira, 9 de janeiro de 2014 18:49
  • Você já tentou colocar no value do combo algum valor? 

    por exemplo

    value                  text

    1                       cobre

    3                       estanho

    2                       ouro

    sempre incremente 1 ao value do próximo item inserido, por exemplo:

    O próximo item a ser inserido "Ferro", ficaria acima do "Ouro" mas o "ferro" deve ficar selecionado.

    value                  text

    1                        cobre

    3                        estanho

    4                        ferro

    2                        ouro

    para selecionar o "ferro", que foi o ultimo item inserido ( você sabe disso porque o value dele é o maior ), faça um loop percorrendo o combo para verificar qual value é o maior

    encontrando o maior, basta seleciona-lo.

    combo.SelectedValue() = maiorvalue;

    Wennder




    quinta-feira, 9 de janeiro de 2014 19:58
  • Sim, eu já tentei isso. Inclusive, no meu primeiro post eu falo sobre isso:

    "Outra coisa que eu já tentei - e que funciona - é a utilização de um parâmetro auxiliar com auto-incremento onde eu colocaria minha tabela em ordem descendente de acordo com esse parâmetro, mas fica esteticamente bem ruim. Ideias ? Agradeço desde já."

    Inclusive, fica esteticamente bem desagradável, pois a ordem de seleção do combobox fica fora de ordem alfabética e não fica muito legal procurar itens assim, pois a lista é imensa.

    Att,

    Ricardo Scheufele

    *Edit: Acho que o meu problema é conceitual. Algum casting ou coisa do tipo. É uma impressão.
    • Editado themartians quinta-feira, 9 de janeiro de 2014 20:29
    quinta-feira, 9 de janeiro de 2014 20:26
  • A forma que eu disse na minha ultima resposta o combo vai ficar em ordem alfabética, e você usará o value dele para definir qual o ultimo item inserido.

    Wennder

    quinta-feira, 9 de janeiro de 2014 20:35
  • Exatamente, cara. Isso realmente é diferente de mudar a ordem pelo valor da posição. Mas fiz as modificações e o meu problema persiste, pois você diz o seguinte:

    combo.SelectedValue() = maiorvalue

    O que seria o seu "maiorvalue" ? O meu "ref" ? Uma string? Pois continua não encontrando esse valor e não atualizando na combobox. Na realidade, a situação fica muito parecida armazenar o último Nome entrado e excursionar pela tabela para procurá-lo.

    Outra coisa, brigadaço pela ajuda, eu sei que o pessoal não tem muito tempo e é sempre muito legal.

    Bleh, ultimo post do dia. Bom trabalho amanhã.

    Att,

    Ricardo S.


    • Editado themartians quinta-feira, 9 de janeiro de 2014 21:14
    quinta-feira, 9 de janeiro de 2014 21:12
  • Ola novamente Ricardo,

    no combo box você consegue atribuir valores em 2 lugares, que são eles:

    combo.TEXT = "ferro"

    combo.VALUE = 1

    A minha ideia para resolver seu problema é a seguinte:

    Carregue também o value do seu combo, pois, este ira ser a sua ''variável'' auxiliar para selecionar o ultimo item inserido.  De que forma? da forma que eu expliquei no penúltimo post.

    O "maiorvalue" que você perguntou no seu ultimo post seria uma variável utilizada para armazenar o maior value atribuído a um item do combo ate o momento.

    Se você ainda não estiver entendendo, eu crio um projetinho aqui e te mando.

    Wennder

    quinta-feira, 9 de janeiro de 2014 23:24
  • Olá,

    Wennder, eu juro que eu tentei ao máximo não te pedir isso, mas o "projetinho" seria bom.

    Att,

    Ricardo Scheufele

    sexta-feira, 10 de janeiro de 2014 12:20
  • Olá,

    Resolvi o problema fazendo isso. Mas poste sua resposta, se quiser, estou bem curioso.

    Combo.DataSource = From Nome In d.Coefs
                       Order By Nome.Nome
                       Select Nome
    
    
    Dim obje = From Nome In Combo.Items Where Nome.Nome = ref Select Nome.Nome
    
    For Each element In obje
          Combo.SelectedValue = element
    Next

    Valeu por tudo.

    Att,

    Ricardo S.

    • Marcado como Resposta themartians sábado, 11 de janeiro de 2014 15:15
    sexta-feira, 10 de janeiro de 2014 12:48
  • Ola novamente Ricardo,

    no combo box você consegue atribuir valores em 2 lugares, que são eles:

    combo.TEXT = "ferro"

    combo.VALUE = 1

    A minha ideia para resolver seu problema é a seguinte:

    Carregue também o value do seu combo, pois, este ira ser a sua ''variável'' auxiliar para selecionar o ultimo item inserido.  De que forma? da forma que eu expliquei no penúltimo post.

    O "maiorvalue" que você perguntou no seu ultimo post seria uma variável utilizada para armazenar o maior value atribuído a um item do combo ate o momento.

    Se você ainda não estiver entendendo, eu crio um projetinho aqui e te mando.

    Wennder

    Olá,

    Se você postar um código, eu marco como resposta sem problemas, pois eu acho - acho - que ainda não compreendi 100%. A minha respota vai logo abaixo, eu realmente estava com dúvidas em outra coisa que seria o que retornava do meu query. Valeu.

    Att,

    Ricardo S.


    • Editado themartians sábado, 11 de janeiro de 2014 03:08
    • Marcado como Resposta themartians sábado, 11 de janeiro de 2014 15:15
    • Não Marcado como Resposta themartians sábado, 11 de janeiro de 2014 15:15
    sábado, 11 de janeiro de 2014 03:07
  • Olá Ricardo,

    me desculpe, eu estava com a cabeça no componente DropDownList (o combo box do asp.net), esse componente tem o Value, ou seja, é possível adicionar um value e um text para o componente.

    Mas seguindo a mesma lógica criei o código abaixo que funcionou perfeitamente também, de uma olhada:

     ''INSERINDO VALORES NO COMBO
            ComboBox1.Items.Add("A")
            ComboBox1.Items.Add("B")
            ComboBox1.Items.Add("D")
            ComboBox1.Items.Add("E")
    
    
            Dim aux(ComboBox1.Items.Count - 1 + 1) As String ''DECLARANDO ARRAY COM TAMANHO DO COMBO +1
    
            For i = 0 To ComboBox1.Items.Count - 1  'Criando uma cópia do combo dentro do array antes de adicionar o próximo valor no combo
                aux(i) = ComboBox1.Items(i)
            Next
    
            ComboBox1.Items.Add("C") 'ADICIONANDO PRÓXIMO VALOR AO COMBO
            aux(ComboBox1.Items.Count - 1) = ComboBox1.Items(ComboBox1.Items.Count - 1) ''ADICIONANDO NO ARRAY O ULTIMO VALOR ADICIONADO NO COMBO
    
    
            ComboBox1.Sorted = True 'DEIXANDO O COMBO EM ORDEM ALFABÉTICA, OU SEJA, O VALOR "C" NÃO SERÁ MAIS O ULTIMO
    
            'AGORA O CÓDIGO PARA VERIFICAR QUAL O ULTIMO ITEM ADICIONADO
            'VOU COMPARAR O COMBO COM O ARRAY E O PRIMEIRO ITEM DO COMBO QUE FOR DIFERENTE DO ARRAY É O ULTIMO ADICIONADO
            For i = 0 To ComboBox1.Items.Count - 1
                If aux(i) <> ComboBox1.Items(i) Then
                    ComboBox1.SelectedIndex = i
                    Exit Sub 'QUANDO ELE ENCONTRA EU ENCERRO A FUNÇAO, PORQUE SE ELE NÃO ENCONTRA ALGUM DIFERENTE QUER DIZER QUE O ULTIMO ITEM INSERIDO JÁ ESTA EM ORDEM ALFABÉTICA
                End If
            Next
    
            ''CASE ELE NÃO ENCONTRE NENHUM DIFERENTE EU SELECIONO O ULTIMO VALOR DO COMBO
            ComboBox1.SelectedIndex = ComboBox1.Items.Count - 1

    Wennder



    sábado, 11 de janeiro de 2014 04:49