none
Adicionando itens para uma grid sem se repetir RRS feed

  • Pergunta

  • eu tenho uma class onde eu consigo adicionar os meus itens para uma list e depois enviá-las para uma grid. O meu problema é com os itens repetidos, como impedir isso? Eu adiciono perfeitamente para a grid, depois adiciono outros mas dai e se o usuário selecionar o mesmo item que ja esta na lista? Gostaria de que ele ignorasse esses itens.

    Maneira de como eu adiciono para a grid:

    atribuicoes = new Consultas.AtribuicoesVagas();
    atribuicoes.ShowDialog();
    
    list.AddRange(atribuicoes.Lista);
    
    grid.ItemsSource = list;

    Class:

    public class ObservableRangeCollection<T> : ObservableCollection<T>
    {
    /// <summary> 
    /// Adds the elements of the specified collection to the end of the ObservableCollection(Of T). 
    /// </summary> 
    public void AddRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException("collection");
    
        foreach (var i in collection) Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
    
    /// <summary> 
    /// Removes the first occurence of each item in the specified collection from ObservableCollection(Of T). 
    /// </summary> 
    public void RemoveRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException("collection");
    
        foreach (var i in collection) Items.Remove(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
    
    /// <summary> 
    /// Clears the current collection and replaces it with the specified item. 
    /// </summary> 
    public void Replace(T item)
    {
        ReplaceRange(new T[] { item });
    }
    
    /// <summary> 
    /// Clears the current collection and replaces it with the specified collection. 
    /// </summary> 
    public void ReplaceRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException("collection");
    
        Items.Clear();
        foreach (var i in collection) Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
    
    /// <summary> 
    /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. 
    /// </summary> 
    public ObservableRangeCollection()
        : base()
    { }
    
    /// <summary> 
    /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class that contains elements copied from the specified collection. 
    /// </summary> 
    /// <param name="collection">collection: The collection from which the elements are copied.</param> 
    /// <exception cref="System.ArgumentNullException">The collection parameter cannot be null.</exception> 
    public ObservableRangeCollection(IEnumerable<T> collection)
        : base(collection)
    { }
    }

    Detalhe:

    a lista que eu estou adicionando no AddRange, é uma IList.


    quinta-feira, 10 de setembro de 2015 14:05

Respostas

  • Rodrigo, tentei dessa primeira maneira mas não aconteceu nada cara, ele esta adicionando normalmente mas com o mesmo problema de repetir os itens....

    Vou tentar a outra forma.

    Eu testei com um List<int>, e funcionou perfeitamente. Talvez pra ti não funcionou porque o tipo da tua lista seja uma classe ou algo assim. Se for o caso, tente mais estas opções:

    list.AddRange(atribuicoes.Lista.Where(i => list.Where(r => r.Equals(i)).Count() == 0));
    
    //Neste caso, assumindo que Id seja a sua Pk
    list.AddRange(atribuicoes.Lista.Where(i => list.Where(r => r.Id.Equals(i.Id)).Count() == 0));
    
    Vai que dá certo..

    • Marcado como Resposta EmersonJau quinta-feira, 10 de setembro de 2015 18:34
    quinta-feira, 10 de setembro de 2015 16:09

Todas as Respostas

  • Olá!

       Existem várias possibilidades, mas vou indicar duas:

    1. Utilize Linq para suprimir resultados repetidos;

    // Acho que isto já filtraria
    list.AddRange(atribuições.Lista.Where(i => !list.Contains(i)));

    2. Considere passar uma segunda coleção como parâmetro no método AddRange, mas contendo os itens que já estão no list e que devem ser ignorados, tratando isto no foreach.

    Bom trabalho!

    quinta-feira, 10 de setembro de 2015 15:15
  • Rodrigo, tentei dessa primeira maneira mas não aconteceu nada cara, ele esta adicionando normalmente mas com o mesmo problema de repetir os itens....

    Como que eu poderia tratar dentro do Foreach dessa segunda forma?

    To sem sucesso por enquanto =/


    • Editado EmersonJau quinta-feira, 10 de setembro de 2015 16:07
    quinta-feira, 10 de setembro de 2015 15:44
  • Rodrigo, tentei dessa primeira maneira mas não aconteceu nada cara, ele esta adicionando normalmente mas com o mesmo problema de repetir os itens....

    Vou tentar a outra forma.

    Eu testei com um List<int>, e funcionou perfeitamente. Talvez pra ti não funcionou porque o tipo da tua lista seja uma classe ou algo assim. Se for o caso, tente mais estas opções:

    list.AddRange(atribuicoes.Lista.Where(i => list.Where(r => r.Equals(i)).Count() == 0));
    
    //Neste caso, assumindo que Id seja a sua Pk
    list.AddRange(atribuicoes.Lista.Where(i => list.Where(r => r.Id.Equals(i.Id)).Count() == 0));
    
    Vai que dá certo..

    • Marcado como Resposta EmersonJau quinta-feira, 10 de setembro de 2015 18:34
    quinta-feira, 10 de setembro de 2015 16:09
  • Tava confiante agora achando que ia funcionar, mas ainda nada... =(

    To postando uma parte do meu código...

    Carregando os itens para minha Grid de escolhas:

    public void carregarAtribuicoesVagas()
            {
                var list = new ObservableCollection<ItensAtribuicao>();
    
                atribuicoesController = new AtribuicoesController();
    
                foreach (DataRow row in atribuicoesController.ListarTodasAtribuicoes().Rows)
                {
                    var obj = new ItensAtribuicao()
                    {
                        Atribuicao = (string)row.ItemArray[0],
                        Codigo = (int)row.ItemArray[1],
                        CodigoChar = (string)row.ItemArray[2],
                        Descricao = (string)row.ItemArray[3],
                        Pontuacao = (int)row.ItemArray[4]
                    };
                    list.Add(obj);
                }
    
                gridAtribuicoesVagas.ItemsSource = list;
            }
    Maneira de como eu seleciono os itens e adiciono na lista:

    public IList<ItensAtribuicao> Lista
            {
                get
                {
                    return lista;
                }
            }
    
            private void gridAtribuicoesVagas_SelectionChanged(object sender, GridSelectionChangedEventArgs e)
            {
                lista.Clear();
                foreach (ItensAtribuicao item in gridAtribuicoesVagas.SelectedItems)
                {
                    lista.Add(item);
                }
            }

    Dai o problema esta na hora de chamar esse método =/


    quinta-feira, 10 de setembro de 2015 16:27
  • Cara, aparentemente está tudo ok. Tenta mais isto:

    //Antes de atribuir o list ao grid, limpa ele
    grid.ItemsSource = null;
    grid.ItemsSource = list;

    quinta-feira, 10 de setembro de 2015 17:37
  • Cara, eu estava mexendo em umas outras coisas aqui e acabou funcionando. Realmente dessa maneira funcionou perfeitamente...

    O problema é que não sei onde era o erro.. hahahah

    Mesmo assim, muito Obrigado Rodrigo!

    Abraço.

    quinta-feira, 10 de setembro de 2015 18:34