Usuário com melhor resposta
Adicionando itens para uma grid sem se repetir

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
, é umaIList
.
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
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!
-
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
-
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
-
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 =/
-
-