DataGridView com colunas de tabelas diferentes

21/10/2014

Olá a todos.
Tenho a classe Cliente
public class Cliente { public int IdCliente { get; set; } public string Nome { get; set; } public CodPostal Cod { get; set; } } public clasee CodPostal { public string IdCodPostal { get; set; } public string Localidade { get; set; } }


Depois tenho um form com uma datagridview que quero que apareça Nome | Codigo-Postal | Localidade

Para tal tenho uma procedure que devolve esses campos.

DataTable table = resultado da procedure; ClienteCollection colClientes = new ClienteCollection(); foreach(DataRow linha in table.Rows) { Cliente cliente = new Cliente(); cliente.Nome = tabela["Nome"].ToString(); CodPostal codP = new CodPostal(); codP.IdCodPostal = tabela["IdCodPostal"].ToString(); codPostal.Localidade = tabela["Localidade"].ToString(); cliente.Cod = codP; colClientes.Add(cliente); }


O erro é que no dataGridView não aparece o campo referente a cliente.Cod.IdCodPostal nem cliente.Cod.Localidade

Guilherme

Respostas

21/10/2014

Joel Rodrigues

Neste caso você precisará usar um tipo dinâmico:
List<object> clientes = new List<object>();

foreach(DataRow linha in table.Rows) {
	var cli= new {
		Nome = linha["Nome"].ToString(),
		CodigoPostal = linha["IdCodPostal"].ToString(),
		Localidade = linha["Localidade"].ToString()
	};
	clientes.Add(cli);
}

dataGrid.DataSource = clientes;
Responder Citar

21/10/2014

Guilherme

Mas eu tenho o projeto em camadas.
O código que voçê indicou está na camada de negócios e o form na camada de apresentação.

no form eu tinha um método que fazia
ClienteNegocio cliNegocio = new ClienteNegocio(); ClienteCollection colClientes = clienteNegocio.getDados(textboxPesquisa.Text); dataGrid.DataSource = null; dataGrid.DataSource = colClientes; dataGrid.Update(); dataGrid.Refresh();


Mas agora se meu método getDados da classe ClienteNegocio não devolve ClienteCollection.
Pode devolver List<object>? é que dá erro dessa maneira
Responder Citar

22/10/2014

Joel Rodrigues

Qual erro?
Responder Citar

22/10/2014

Guilherme

Desculpe, não é erro.
Apenas não aparece a Localidade.
Responder Citar

22/10/2014

Guilherme

Já rola. Foi erro meu ao editar as colunas do datagrid.
Obrigado pela ajuda
Responder Citar

27/10/2014

Guilherme

Ainda dentro deste problema.
No dataGrid está tudo correto, mas como faço para ao clicar numa linha me apareça um form com essa informação?
Depois de fazer
foreach (DataRow linha in tabela.Rows) { var medico = new { Nome = (linha["Nome"]).ToString(), Morada = linha["Morada"].ToString(), IdCodPostal = (linha["IdCodPostal"]).ToString(), Localidade = linha["Localidade"].ToString() }; medicos.Add(medico); }


Tenho o seguinte método para quando fizer double click numa linha
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { object objetoSelecionado = (dataGridView1.SelectedRows[0].DataBoundItem as object); NovoForm novoF = new NovoForm(); novoF.carregaCampos(objetoSelecionado); novoF.Show(); }


Depois, no NovoForm preciso ter um método que preencha a tela com dados que vem do objetoSelecionado.
Mas tou com problemas na parte de desenvolvimento do método carregaCampos pois n compreendo bem a usabilidade do tipo object.

Obrigado
Responder Citar

28/10/2014

Joel Rodrigues

O problema de lidar com tipos dinâmicos é o fato de eles serem dinâmicos =)
Ou seja, não tem como fazer cast e pegar suas propriedades. Para conseguir isso, você teria que criar uma classe com os campos que deseja e ao invés de "as Object", fazer "as Classe".
Responder Citar

31/10/2014

Guilherme

Devo fazer então uma classe com os atributos Nome, Morada, IdCodPostal, Localidade certo?
Responder Citar

01/11/2014

Joel Rodrigues

Devo fazer então uma classe com os atributos Nome, Morada, IdCodPostal, Localidade certo?
Exatamente. Dessa forma você terá todas as propriedades acessíveis.
Responder Citar