Conversão List<object> para List<T> ...

88 views
Skip to first unread message

Ricardo Rocha

unread,
Jan 25, 2010, 6:23:42 AM1/25/10
to dot...@googlegroups.com
Pessoal,

Criei um UserControl (windows forms) e nele coloquei um DataGridView. Estou implementando um paginador e estou com um problema que ainda não sei como resolver.

O que acontece:
O DataSource do DataGridView é um object e eu populo o mesmo com um List<T>.
Para poder filtrar os dados (paginar) eu preciso criar um List dinamicamente para poder copiar os itens da página a ser exebida (o objeto original, completo, fica guardado internamente).

Acredito ter duas opções para filtrar os dados:
1 - Sempre copiar os indice de itens baseado na página atual
2 - Sempre setar os dados usando a variável de dados originais com um RemoveRange() tirando os itens fora do range (indice da página)

Tentei criar um List usando typeof sobre o primeiro item da coleção recebida pelo DataSource, mas não obtive êxito.

Alguma idéia ???

Grato

Ricardo José Alves da Rocha
Porto Alegre - RS

Vinicius Rocha

unread,
Jan 25, 2010, 7:40:05 AM1/25/10
to dot...@googlegroups.com
Não sei se entendi direito, você está querendo filtrar ou paginar?

Adiantando. Você pode receber como DataSource um IQueryable, pode ser mais adequado para o que você está querendo fazer.

Para paginação você pode usar dois métodos do LINQ: Skip e Take.

Supomos que você queira paginar de 10 em 10: a página 1 seria colecao.Skip(0 * 10).Take(10), a página 2 seria Skip(1 * 10).Take(10), a página 3 seria Skip(2 * 10).Take(10), e assim por diante.

Você pode colocar no evento OnDataBinding (acho que esse deve ser o nome do evento) o seguinte código:

grid.DataSource = colecao.Skip(2 * 10).Take(10); // página 3

Eu não desenvolvo em Windows Forms, mas acredito que o DataGridView já tem paginação.

Espero ter ajudado,
Vinicius Rocha

2010/1/25 Ricardo Rocha <ricardor...@gmail.com>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "dotNUG - .NET User Group" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para dot...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para dotnug+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/dotnug?hl=pt-BR.

Ricardo Rocha

unread,
Jan 25, 2010, 8:09:45 AM1/25/10
to dot...@googlegroups.com
Vinicius,

O resultado final será paginação !

Conheço o IQueryable e uso muito ele em diversos momentos, mas este componente precisará receber um List mesmo ...

Eu não conheço paginação para o DataGridView e pelo que pesquisei não há mesmo, pois encontrei várias soluções para paginá-lo, mas todas acabavam usando DataTable, o que não é o meu caso.

O sistema de paginação em si eu sei como fazer, meu problema está em pegar apenas os dados que preciso exibir.

Neste momento estou dando uma olhada na classe BindingSource, acho que ela pode me ajudar, eu posso setar o DataSource dela usando um List, mas é uma possibilidade, ainda não consegui o que desejo.

Como o método DataSource recebe um object eu precisaria fazer uma conversão para poder filtrar os dados usando o List ... ainda não sei como fazer isso ou qual a melhor alternativa para o que desejo.

Valeu !!
[]'s


Ricardo José Alves da Rocha
Porto Alegre - RS


2010/1/25 Vinicius Rocha <vmr...@gmail.com>

Vinicius Rocha

unread,
Jan 25, 2010, 8:15:25 AM1/25/10
to dot...@googlegroups.com
Usando LINQ você pode filtar uma lista e pode usar o Take e o Skip para paginação.

Não sei se vai ser necessário, mas você pode converter um List pra IQueryable usando .AsQueryable() e de IQueryable para List usando ToList(); Ambos podem ser fortemente tipados.

Exemplo de filtro:

grid.DataSource = from x in colecao where x.Nome.Contains("teste");

ou

grid.DataSource = colececao.Where(x => x.Nome.Contains("teste"));

Abraço,

Ricardo Rocha

unread,
Jan 25, 2010, 8:23:24 AM1/25/10
to dot...@googlegroups.com
Não conhecia o "AsQueryable" ... muito bom saber, porém continuo com o problema.

O DataSource recebe um object ... eu precisaria converter para List para poder aplicar isso (ou converter direto para IQueryable).

Essa conversão que está me atrapalhando, entende ?
Se eu conseguir converter para um IQueryable para mim ficará perfeito, mas preciso converter um object ... e aí não deu certo AINDA.

Vinicius Rocha

unread,
Jan 25, 2010, 9:08:05 AM1/25/10
to dot...@googlegroups.com
Não entendi porque você precisa pegar o valor que ta no datasource. Você tem que guardar a fonte de dados em outro local (uma variável do componente, por exemplo). Você só vai atribuir ao datassource a página corrente.

2010/1/25 Ricardo Rocha <ricardor...@gmail.com>

Jarbas Segundo

unread,
Jan 25, 2010, 9:32:48 AM1/25/10
to dot...@googlegroups.com
eu crio lists dinamicamente assim

http://blog.jsegundo.com.br/post/2009/11/29/Criando-uma-List3c3e-dinamicamente.aspx

[]'s
Jarbas B. M. Segundo
Desenvolvedor .NET
Celular: +55(77)9123-4231
Messenger : jbmsegundo[AT]hotmail.co.uk
Skype : jbmsegundo
Blog : http://blog.jsegundo.com.br

Vinicius Rocha

unread,
Jan 25, 2010, 9:54:37 AM1/25/10
to dot...@googlegroups.com
Humm... porque não usar o método .ToList();

System.Collections.IList teste = (new object[] { 1, 2, 3 }).ToList();

Não dá no mesmo?

2010/1/25 Jarbas Segundo <jbmse...@gmail.com>

Ricardo Rocha

unread,
Jan 25, 2010, 10:34:20 AM1/25/10
to dot...@googlegroups.com
Como estou usando um UserControl, nele criei um DataSorce ... e nessa propriedade seto o DataSorce do grid em si .... criei a propriedade do mesmo tipo

public List<T> DataSource
{
  get;
  set;
}

Se pudesse declarar uma propriedade como a acima funcionaria porque não seria um object e eu poderia trabalhar os dados numa boa.


Então, eu guardo os dados numa variável do componente e então seto o DataSource do grid ... porém, que opção eu teria para receber qualquer dado e dinamicamente trabalhar com o tipo dele ?

Vinicius Rocha

unread,
Jan 25, 2010, 11:34:17 AM1/25/10
to dot...@googlegroups.com
Então acho que o caminho é usar object mesmo. Esse cast funciona na sua aplicação?

List<object> lista = (List<object>)dataSource;
grid.DataSource = lista.Skip(1 * 10).Take(10); // página 2

Eu realmente nunca tentei fazer isso, não sei nem se esse código roda. =)

2010/1/25 Ricardo Rocha <ricardor...@gmail.com>

Ricardo Rocha

unread,
Jan 25, 2010, 11:40:59 AM1/25/10
to dot...@googlegroups.com
Não funciona, passei o final de semana tentando isso e variantes relacionadas

O erro:
Não é possível converter um objeto do tipo 'System.Linq.EnumerableQuery`1[MeuDominio.MinhaClasse]' no tipo 'System.Collections.Generic.List`1[System.Object]'.

Vinicius Rocha

unread,
Jan 25, 2010, 11:43:18 AM1/25/10
to dot...@googlegroups.com
E se antes de você definir o valor do datasource do usercontrol você fizer um .ToList();?

Ricardo Rocha

unread,
Jan 25, 2010, 11:49:58 AM1/25/10
to dot...@googlegroups.com
Como pensou em usar o ToList() ?
As formas que tentei geraram o mesmo erro !!!

Vinicius Rocha

unread,
Jan 25, 2010, 11:54:40 AM1/25/10
to dot...@googlegroups.com
Não entendi.

Ricardo Rocha

unread,
Jan 25, 2010, 12:01:41 PM1/25/10
to dot...@googlegroups.com
Eu estava respondendo este teu e-mail quando me ocorreu uma coisa quanto ao que vc falou !!
Para o método DataSorce eu já envio o ToList() assim, internamente funciona !!!

Ele não exibiu os registros no Grid baseado na variável que apliquei o Skip, mas consegui trabalhar com os dados de alguma forma !!

Não é exatamente o que eu queria (ter que enviar usando o ToList), mas ao menos agora já tenho algo ... hehehe.


Obrigado !!

Vinicius Rocha

unread,
Jan 25, 2010, 12:07:02 PM1/25/10
to dot...@googlegroups.com
Depois uma centena de emails chegamos a algum lugar. \o/

Tomara que dê certo então. =)

Ricardo Rocha

unread,
Jan 25, 2010, 12:09:42 PM1/25/10
to dot...@googlegroups.com
Sim ....

Para mostrar no Grid precise colocar .ToArray(), daí foi lido como fonte de dados certinho !!!
No bind verificarei se não for do tipo ToList vou lançar uma excessão ... neste primeiro momento isso já resolve o problema !!!

Valeu !
Reply all
Reply to author
Forward
0 new messages