DataGridView com colunas de tabelas diferentes

.NET

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

Guilherme

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

21/10/2014

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;
GOSTEI 0
Guilherme

Guilherme

21/10/2014

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
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/10/2014

Qual erro?
GOSTEI 0
Guilherme

Guilherme

21/10/2014

Desculpe, não é erro.
Apenas não aparece a Localidade.
GOSTEI 0
Guilherme

Guilherme

21/10/2014

Já rola. Foi erro meu ao editar as colunas do datagrid.
Obrigado pela ajuda
GOSTEI 0
Guilherme

Guilherme

21/10/2014

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
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/10/2014

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".
GOSTEI 0
Guilherme

Guilherme

21/10/2014

Devo fazer então uma classe com os atributos Nome, Morada, IdCodPostal, Localidade certo?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

21/10/2014

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