Array
(
)

DataGridView com colunas de tabelas diferentes

Guilherme
   - 21 out 2014

Olá a todos.
Tenho a classe Cliente
Citação:

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.

Citação:

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

Joel Rodrigues
   - 21 out 2014

Neste caso você precisará usar um tipo dinâmico:
#Código

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;

Guilherme
   - 21 out 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

Citação:

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

Joel Rodrigues
   - 22 out 2014

Qual erro?

Guilherme
   - 22 out 2014

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

Guilherme
   - 22 out 2014

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

Guilherme
   - 27 out 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

Citação:

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

Citação:

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

Joel Rodrigues
   - 28 out 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".

Guilherme
   - 31 out 2014

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

Joel Rodrigues
   - 01 nov 2014


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