DataGridView com colunas de tabelas diferentes
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
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
Curtidas 0
Respostas
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
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
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
21/10/2014
Qual erro?
GOSTEI 0
Guilherme
21/10/2014
Desculpe, não é erro.
Apenas não aparece a Localidade.
Apenas não aparece a Localidade.
GOSTEI 0
Guilherme
21/10/2014
Já rola. Foi erro meu ao editar as colunas do datagrid.
Obrigado pela ajuda
Obrigado pela ajuda
GOSTEI 0
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
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
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".
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
21/10/2014
Devo fazer então uma classe com os atributos Nome, Morada, IdCodPostal, Localidade certo?
GOSTEI 0
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