Fórum Atualizar DataGridView usando Linq com C# (tabela com FK) #10330
24/10/2009
0
Preciso atualizar um grid utilizando Visual Studio 2008, LINQ e C#.
Estou em um projeto Windows Forms.
Eu navego entre os campos fk, do tipo tblMaster.tblDetail.field
Mas o problema eh que quando chego no field, o campo tem o mesmo nome da tabela master, e o select não aceita campos com nomes iguais.
Eu criei um método dentro da unit, do form, mas estou passando tudo pra classes.
Uma amiga me disse que existe uma maneira muito melhor de se atualizar um grid, criando uma classe pra isso, e utilizando uma collection de objects, mas eu não entendi muito bem.
Vou passar o meu método (que está dentro do corpo do form) e gostaria que vocês consultores analizassem, mas não apenas corrigissem o erro e me possibilitem atualizar o grid com esse select dentro do form.
Gostaria que me passassem a maneira correta de se atualizar um grid com LINQ, utilizando uma classe, ou no mínimo um método de classe para isso.
Lembrando que não posso modificar as tabelas facilmente, pois elas são desenvolvidas por um DBA que nos presta consultoria, e a minha versão ficaria diferente da versão dele. So mudaria se fosse estritamente necessário)
Vou postar o meu método, e a partir dele vocês ficam a par da tabela, dos campos e das fks.
Fico a disposição pra postar trechos de código, scrip de tabela, o que for necessário!
private void atualizarGrid()
{
try
{
//Instancia da classe de conexão com o LINQ
Entities db = new Entities();
//Le o ID do item do combo atraves da property Value
int codGrupoSubFamilia = Convert.ToInt32(cmbGrupoSubFamilia.SelectedValue);
int codGrupoSub = Convert.ToInt32(cmbGrupoSub.SelectedValue);
int codGrupo = Convert.ToInt32(cmbGrupo.SelectedValue);
//Le os registros com os parametros dos 3 combos e preenche o GRID
var newProdutoFilter = (from p in db.Produto
where (
(p.GrupoSubFamilia.codigoGrupoSub == codGrupoSub) &&
(p.GrupoSubFamilia.codigoGrupoSubFamilia == codGrupoSubFamilia) &&
(p.GrupoSubFamilia.codigoGrupo == codGrupo))
orderby p.codigo descending
select new
{
p.codigo,
p.descricao,
p.descricaoReduzida,
p.descricaoECF,
undMedProd = p.UnidadeMedida.codigo,
grupoCod = p.GrupoSubFamilia.GrupoSub.Grupo.codigo,
p.GrupoSubFamilia.GrupoSub.codigoGrupoSub,
p.GrupoSubFamilia.codigoGrupoSubFamilia,
p.tipo,
p.ativo
});
grdProduto.DataSource = newProdutoFilter;
btnNovoProduto.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show("Problema ao atualizar o grid : \n"
+ ex.Message,
"Atualizar Grid"
);
}
}
Como podem ver, tive de apelidar 2 campos, pois dava erro de compilação ao utilizar nomes de campos iguais...
Como disse anteriormente eu preferia uma nova orientação a seguir, como utilizar uma classe pra preencher grid, pois em uma classe eu poderia nomear os campos como bem entendesse.
Fico no aguardo e espero que tenham entendido meu problema!
Daniel Vieira
Curtir tópico
+ 0Posts
27/10/2009
Fabio Mans
Gostei + 0
27/10/2009
Daniel Vieira
Esta na ScreenShot abaixo:
O que eu estou fazendo errado pra nao preencher os campos FK?
Ps: Se eu utilizar aquele metodo gerado automaticamente do Grid no load do form ele preenche corretamente, mas eu preciso utilizar filtros, por isso necessito do select.
O que eu preciso fazer pra preencher completamente o grid com aqueles metodos de sua classe?
Gostei + 0
27/10/2009
Fabio Mans
Gostei + 0
27/10/2009
Daniel Vieira
esse foi o motivo da minha abertura de chamado, preciso preencher o grid com os dados das FK.
Gostei + 0
27/10/2009
Fabio Mans
Gostei + 0
27/10/2009
Daniel Vieira
Minha necessidade era realmente preencher o grid com todos os campos, inclusive os FK (que não estavam preenchendo).
Eu pedi ajuda a alguns colegas de faculdade que trabalham com a mesma tecnologia, e eles me disseram pra tirar da UI e colocar em uma classe, que retornando uma lista de objetos funcionaria.
Minha amiga me passou o seguinte exemplo:
//Classe Pessoa para ser usada na apresentação na DataGridView
public class Pessoa
{
public string Nome
{
get;
set;
}
public int Idade
{
get;
set;
}
}
//Método para a apresentação e atualização dos dados na DataGridView
private void Atualiza()
{
List<Pessoa> listaPessoa = new List<Pessoa>();
foreach ("NomeDaTabela" p in this."NomeDaTabela")
{
Pessoa pes = new Pessoa();
pes.Nome = p."NomePessoa";
pes.Idade = p."IdadePessoa";
listaPessoa.Add(pes);
}
this."NomeDoSeuDataGridView".DataSource = listaPessoa.ToList();
}
Eu não entendi muito bem o exemplo dela, e resolvi abrir um chamado, tentando reunir o máximo de informações que eu tinha para facilitar o entendimento do problema. Acabei focando mais onde não devia. Peço desculpas.
Eu gostaria de informar que o exemplo pra preenchimento do Grid Grupo funcionou corretamente aqui também, está exibindo a chave estrangeira do usuário.
Mas o grid de produtos não esta exibindo nenhuma FK, nem a de usuario, que exibe no grid Grupo.
Abaixo vou postar o grid Grupo, pravoce ver que aqui tambem preenche.
Focamos agora no problema do Produto, pois principalmente nele eu preciso aplicar alguns filtros, e exatamente nele é que nao esta exibindo as FK. Faça um teste no seu sistema pra podermos verificar se o erro ocorre com o seu projeto WEB também.
Gostei + 0
27/10/2009
Fabio Mans
Gostei + 0
27/10/2009
Daniel Vieira
O filtro são Grupo, SubGrupo, Familia, e tambem preciso ordenar decrescente por código de família.
Gostei + 0
27/10/2009
Fabio Mans
Gostei + 0
28/10/2009
Daniel Vieira
Como eu faria esse filtro que você está indicando??
Eu na verdade preciso exibir todos os dados no grid, não importa muito como, pode ser de qualquer jeito, desde que apareça todos os campos, e eu possa ficar atualizando ele. Unico filtro realmente necessário seria o de grupo + subgrupo + familia, pro usuário ver a quantidade de registros agrupados, e cadastrar o que ainda está faltando.
Se de qualquer maneira eu preencher o grid está valendo.
Gostei + 0
28/10/2009
Daniel Vieira
Eu estou utilizando o seguinte método:
private void atualizarGridFamilia()
{
try
{
//Instancia da classe de conexão com o LINQ
Entities db = new Entities();
//Le o ID do item do combo atraves da property Value
int codGrupoSub = Convert.ToInt32(cmbGrupoSub.SelectedValue);
int codGrupo = Convert.ToInt32(cmbGrupo.SelectedValue);
//Le os registros com os parametros dos 2 combos e preenche o GRID
var newGrupoSubFilter = (from p in db.GrupoSubFamilia
where (p.codigoGrupoSub == codGrupoSub && p.codigoGrupo == codGrupo)
orderby p.codigoGrupoSubFamilia descending
select new
{
p.codigoGrupoSubFamilia,
p.codigoGrupo,
p.codigoGrupoSub,
p.descricao,
p.comissao,
p.rentabilidade,
p.ativo
});
grdGrupoSubFamilia.DataSource = newGrupoSubFilter;
}
catch (Exception ex)
{
MessageBox.Show("Grid erro : \n"
+ ex.Message);
}
}
No caso da Tabela de família, ele não exigiu navegação entre as tabelas filhas para se obter acesso as fks, porém o mesmo não acontece com a tabela de produto.
Seria problema na estrutura da base??
Gostei + 0
28/10/2009
Fabio Mans
Gostei + 0
28/10/2009
Daniel Vieira
O campo codigo da tabela de produtos eu nomeei codigoProduto.
Campo codigo da tabela de grupo nomeei codigoGrupo.
Nomeei também codigoUsuario.
Mas agora nem o códigoProduto que é PK da tabela de produtos está aparecendo no grid.Nem o campo codigoGrupo está aparecendo no gridGrupo.
Depois de renomear no designer do model.edmx tem que fazer alguma reconfiguração especial??
Gostei + 0
28/10/2009
Daniel Vieira
Quando eu voltei o nome no designer pra codigo (tabela produto), que eh o mesmo nome do campo na base, voltou a preencher no grid...
A não ser que eu esteja renomeando errado...Eu dei botão direito em cima do campo no diagrama de classe do edmx.
Gostei + 0
28/10/2009
Daniel Vieira
Na screenshot da pra verificar melhor:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)