none
retirar items repetidos da combobox RRS feed

  • Pergunta

  • olá,

    estou com problema na minha combo, pois não consigo retirar os valores repetidos dela

    ja usei o comando distinct, mas não funcionou

    também tentei o seguinte código, mas sem sucesso: 

     Dim i As Integer, j As Integer
            For i = 0 To ComboBox2.Items.Count
                For j = i + 1 To ComboBox2.Items.Count
                    If ComboBox2.Items(i).ToString = ComboBox2.Items(j).ToString Then
                        ComboBox2.Items.Remove(j)    -> tentei tambem o RemoveAt, mas ocorreu erro.
                        j = j - 1
                    End If
                Next
            Next

    obs: estou usando vb2008, bd access 2007, e estou preenchendo minha combo à partir da propriedade ComboBox Tasks(q fica localizada no canto superior direto da propria combo), e portanto não preenchi minha combo da maneira mais usada.. usando os códigos. Grato. 

    terça-feira, 21 de fevereiro de 2012 19:01

Respostas

  • Prezado,

    Seguinte... Vou tentar detalhar um pouco mais o que o William explicou... Pelo que entendi do que você explicou, você está utilizando DataSets tipados para retornar os dados do banco... Dessa forma, vá até o seu DataSet (clique duas vezes):

    Clique com o botão direito na tabela que você está utilizando para preencher o ComboBox e escolha a opção Add -> Query:

    Clique next, next... Preencha a query utilizando a cláusula DISTINCT... Poderia ser algo como:

    SELECT DISTINCT NomeDoCampo FROM NomeDaTabela

    Clique next e deixe somente a opção "Fill a DataTable" checada... Dê um nome como FillDistinctRows para essa query e clique em next e finish...

    Vá no código do seu formulário e, no lugar onde é feito o Fill, substitua pelo método FillDistinctRows... Seria algo como:

    this.seuTableAdapter.FillDistinctRows(this.seuDataSet.SuaDataTable);

    Dessa forma acho que vai funcionar para o seu caso... Caso você não esteja trabalhando com datasets tipados como eu entendi, detalhe melhor como você está fazendo...


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quarta-feira, 22 de fevereiro de 2012 20:26
    Moderador
  • FillDistinctRows é um metodo e nao uma propriedade.. vc nao pode fazer "FillDistinctRows = true"

    voce tem que achar onde esta o Metodo Fill() e substitui-lo por 

    Me.tableTableAdapter.FillDistinctRows(this.seuDataSet.SuaDataTable);

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta gc.contatos quinta-feira, 23 de fevereiro de 2012 22:07
    quinta-feira, 23 de fevereiro de 2012 21:32
    Moderador

Todas as Respostas

  • Insira os itens do seu combo em uma lista e de o distinct nessa lista... Mais ou nemos assim:

    Dim minhaLista as new List<string>() Dim contador as integer For i = 0 To Combobox2.Itens.Count minhaLista.Add(Combobox2.Itens(i).ToString) Next

    Combobox2.Itens.Clear minhaLista = MinhaLista.Distinct For i = 0 To MinhaLista.Count Combobox2.Itens.Add(MinhaLista(i)) Next


    Como eu digitei aqui pode ter erro de sintaxe...

    Se ajudou, marque como Resposta ;)

    • Sugerido como Resposta Renato Coqueiro terça-feira, 21 de fevereiro de 2012 19:27
    terça-feira, 21 de fevereiro de 2012 19:26
  • ola Renato coqueiro vlw pwla ajuda,

    mas ainda ñ ta funcionando, o código ficou assim:

    Dim minhaLista As New List(Of String)
    Dim i As Integer

    For i = 0 To ComboBox2.Items.Count
                minhaLista.Add(ComboBox2.Items(i).ToString)*
            Next
            ComboBox2.Items.Clear()
            minhaLista = minhaLista.Distinct

    For i = 0 To MinhaLista.Count
                ComboBox2.Items.Add(minhaLista(i))
            Next

    se tiver errado pode corrigir, aliás, o erro ta na linha* (InvalidArgument=Value '4' não é um valor válido para 'index'. Nome do parâmetro: index)

    abrçs

    quarta-feira, 22 de fevereiro de 2012 02:10
  • Olá,

    Por favor, poste a parte em que você está alimentando o ComboBox... Provavelmente a maneira mais fácil é já filtrar os dados antes de retorná-los da fonte de dados (usando um distinct, como você mencionou que nao funcionou)...


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quarta-feira, 22 de fevereiro de 2012 10:59
    Moderador
  • Prezado(a),
    Estou migrando seu post para o fórum de Desenvolvimento .NET Geral.
    Por favor, das próximas vezes que tiver alguma dúvida relacionada a esse assunto, poste por lá.
    Obrigado.

    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quarta-feira, 22 de fevereiro de 2012 10:59
    Moderador
  •  segue o código corrigido e testado:

            Dim minhaLista As New List(Of String)
    
            Dim i As Integer
    
            For i = 0 To (ComboBox1.Items.Count - 1)
                If minhaLista.Contains(ComboBox1.Items(i)) = False Then 'SE JÁ TIVER NA LISTA NÃO ADICIONO
                    minhaLista.Add(ComboBox1.Items(i).ToString)
                End If
            Next
    
            ComboBox1.Items.Clear()
    
            For i = 0 To (minhaLista.Count - 1)
                ComboBox1.Items.Add(minhaLista(i))
            Next


    Se ajudou, não esqueça de marcar como resposta ;)
    • Sugerido como Resposta Renato Coqueiro quarta-feira, 22 de fevereiro de 2012 11:07
    • Editado Renato Coqueiro quarta-feira, 22 de fevereiro de 2012 11:08
    quarta-feira, 22 de fevereiro de 2012 11:06
  • entao Renato, no cod q vc me mandou o vb ta reportando o seguinte erro:

    A conversão do tipo 'DataRowView' no tipo 'String' não é válida.

    esse erro, segundo o .net ta na linha :" If minhaLista.Contains(ComboBox2.Items(i)) = False Then"

    em relação ao que o Andre Alves Lima perguntou, eu não estou usando código dentro da combo para alimentá-la, e sim uma proprieade no canto superior direito da própria combo (combo tasks), essa propriedade permite preencher a combo com os itens e determinado bd e de determinada tabela,

    Grato.

    quarta-feira, 22 de fevereiro de 2012 16:47
  • Responda aqui a pergunta feita pelo André Alves.

    A soluçao ideal nao é remover os itens duplicados e sim evitar de inseri-los.

    Poste aqui o codigo que vc usa para criar a lista original.. esse tipo de malamarismo deixa a soluçao lenta na maioria das vezes.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 22 de fevereiro de 2012 16:59
    Moderador
  • entum willan, eu não uso codigo pra preencher a combo, tem uma propriedade na combo que se chama comboboxtasks, ela preenche a combo com os dados do bd,

    dessa maneira não sei como inserir sem repetiçoes de valores,

    Grato

    quarta-feira, 22 de fevereiro de 2012 17:36
  • Ok.. Entao é uma consulta SQL que preenche essa combo?

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 22 de fevereiro de 2012 18:07
    Moderador
  • não, a consulta é a um bd access 2007, não sendo necessário definir a string de conexao, o comando e o adapter, a propriedade pega os dados da tabela e lança-os na combo,

    grato

    quarta-feira, 22 de fevereiro de 2012 19:05
  • Mas voce tem como definir uma consulta. Essa consulta deveria ter um distinct. 

    Se vc esta usando binding para popular a combo entao vc nao tem acesso à manipulaçao direta dos itens.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 22 de fevereiro de 2012 19:22
    Moderador
  • então usando essa propriedade não a possibilidade de acesso aos itens(exemplo: excluir algum dos items)?

    como eu poderia preencher a combo usando os codigos? 

    Grato

    quarta-feira, 22 de fevereiro de 2012 19:31
  • Como eu disse anteriormente.. utilizando uma consulta ao inves de uma tabela.

    Esse consulta normalmente é :

    Select distinct campo from tabelas

    Esse distinct força a criar uma lista com valores unicos.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 22 de fevereiro de 2012 20:18
    Moderador
  • Prezado,

    Seguinte... Vou tentar detalhar um pouco mais o que o William explicou... Pelo que entendi do que você explicou, você está utilizando DataSets tipados para retornar os dados do banco... Dessa forma, vá até o seu DataSet (clique duas vezes):

    Clique com o botão direito na tabela que você está utilizando para preencher o ComboBox e escolha a opção Add -> Query:

    Clique next, next... Preencha a query utilizando a cláusula DISTINCT... Poderia ser algo como:

    SELECT DISTINCT NomeDoCampo FROM NomeDaTabela

    Clique next e deixe somente a opção "Fill a DataTable" checada... Dê um nome como FillDistinctRows para essa query e clique em next e finish...

    Vá no código do seu formulário e, no lugar onde é feito o Fill, substitua pelo método FillDistinctRows... Seria algo como:

    this.seuTableAdapter.FillDistinctRows(this.seuDataSet.SuaDataTable);

    Dessa forma acho que vai funcionar para o seu caso... Caso você não esteja trabalhando com datasets tipados como eu entendi, detalhe melhor como você está fazendo...


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quarta-feira, 22 de fevereiro de 2012 20:26
    Moderador
  • Andre Alves Lima,

    não estou usando comando dentro da combobox para preenchê-la (Fill)

    apenas a propriedade combobox tasks preenche a combo

    a propriedade descrita acima não permite manipular os dados da combo?

    Grato

    quinta-feira, 23 de fevereiro de 2012 02:11
  • Prezado,

    Está complicado entender como você está populando a sua ComboBox... Será que você poderia postar um screenshot da maneira que você está utilizando?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quinta-feira, 23 de fevereiro de 2012 07:20
    Moderador
  • deu um print na minha tela, favor desconsidere as informaçoes "o problema agora é...a partir de selecionado determinado nome na combo1..."

    uso apenas essa propriedade para limpar a combo,

    Grato

    quinta-feira, 23 de fevereiro de 2012 19:23
  • Entao.. voce nao leu o que o André disse... olhe na sua soluçao e vai ver que existe um testeDataSet.xsd... é la que vc que que se concentrar... esqueça a combo por enquanto.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quinta-feira, 23 de fevereiro de 2012 20:03
    Moderador
  • willan, entendi sim oque o andre disse, inclusive ja fiz o que ele mostrou,

    mas no momento de substituir o .Fill pelo método .FillDistinctRows não há como,

    pois eu preencho a combo apenas pela propriedade,

    ATT

    quinta-feira, 23 de fevereiro de 2012 20:25
  • Voce tem que ir no codigo do formulario:


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quinta-feira, 23 de fevereiro de 2012 21:02
    Moderador
  • willan agora entendi o que o andre queria dizer, eu fiz a mudança para fillDistinctRows mas ta dando o erro acima

    quinta-feira, 23 de fevereiro de 2012 21:26
  • FillDistinctRows é um metodo e nao uma propriedade.. vc nao pode fazer "FillDistinctRows = true"

    voce tem que achar onde esta o Metodo Fill() e substitui-lo por 

    Me.tableTableAdapter.FillDistinctRows(this.seuDataSet.SuaDataTable);

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta gc.contatos quinta-feira, 23 de fevereiro de 2012 22:07
    quinta-feira, 23 de fevereiro de 2012 21:32
    Moderador
  • Agradeço ao Willan e ao Andre pela ajuda, o aplicativo rodou

    após alterar a propriedade .Fill por .FillDistinctRows foi possível filtrar os valores repetidos

    Att

    quinta-feira, 23 de fevereiro de 2012 22:11