none
Preencher DataGridView com List<Object> RRS feed

  • Pergunta

  • Pessoal, como faço para preencher um DataGridView com um List<Object>.

    Tenho uma lista alunoColecao na classe aluno eu tenho IDAluno e um objeto PessoaFisica pFisica, no construtor de aluno eu ja instancio uma pessoa fisica.

    Tenho um metodo de consulta nele eu preencho uma listaAlunos com dados do banco.

    Como faço para exibir esta lista com estas duas classes no datagrid mais de forma transparente para o usuário?

    tipo no grid exibi: idAluno, Nome, Rg, etc...

    Vlw.

    terça-feira, 19 de agosto de 2014 15:39

Respostas

  • Uma maneira que você pode fazer é criando propriedades para pegar e setar os valores da variável pessoa, segue abaixo.

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                List<Aluno> a = new List<Aluno>();
                a.Add(new Aluno() { PessoaName = "Aluno1", PessoaIdade = 10, Grade = "1", Matricula = "123" });
                a.Add(new Aluno() { PessoaName = "Aluno2", PessoaIdade = 20, Grade = "2", Matricula = "456" });
                a.Add(new Aluno() { PessoaName = "Aluno3", PessoaIdade = 30, Grade = "3", Matricula = "789" });
                a.Add(new Aluno() { PessoaName = "Aluno4", PessoaIdade = 40, Grade = "4", Matricula = "987" });
    
                this.dataGridView1.DataSource = a;
            }
        }
    
        public class Aluno
        {
            public Aluno()
            {
                this.Pessoa = new Pessoa();
            }
    
            public string Grade { get; set; }
    
            public string Matricula { get; set; }
    
            public string PessoaName
            {
                get
                {
                    return this.Pessoa.Name;
                }
                set
                {
                    this.Pessoa.Name = value;
                }
            }
    
            public int PessoaIdade
            {
                get
                {
                    return this.Pessoa.Idade;
                }
                set
                {
                    this.Pessoa.Idade = value;
                }
            }
    
            private Pessoa Pessoa { get; set; }
        }
    
        public class Pessoa
        {
            public string Name { get; set; }
    
            public int Idade { get; set; }
        }

    quarta-feira, 20 de agosto de 2014 11:19

Todas as Respostas

  • Olá, você pode usar o DataSource do DataGridView, segue abaixo o código exemplo:
     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                List<Aluno> lista = new List<Aluno>();
    
                lista.Add(new Aluno() { Name = "Aluno1", Idade = 10 });
                lista.Add(new Aluno() { Name = "Aluno2", Idade = 20 });
                lista.Add(new Aluno() { Name = "Aluno3", Idade = 30 });
    
                this.dataGridView1.DataSource = lista;
            }
        }
    
        public class Aluno
        {
            public string Name { get; set; }
    
            public int Idade { get; set; }
    
        }


    terça-feira, 19 de agosto de 2014 16:26
  • Cara existe varias forma de fazer isso no seu caso pode ser feito da seguinte forma.

    Criar um método private CarregarGrid e na verificação de um post no evento pageload chamar o método caso não seja um post.

    Ex.

    pageload(){
     if(!Page.IsPostBack)
      CarregarGrid();
    }
    
    private void CarregarGrid(){
     idGrid.DataSource = sualista;
     idGrid.DataBinder();  //mostra dados na tela.
    }


    No código aspx vc coloca.

    <asp:GridView ID="idGrid" runat="server" AutoGenerateColumns="false">
     <Columns>
    	<asp:TemplateField>
             <ItemTemplate>
    	  <asp:label ID="lblNome" runat="server" text='<%# DataBinder.Eval(Container.DataItem, "NomeCampo1")%>' /> 
             </ItemTemplate> 
    	</asp:TemplateField> 
    	<asp:TemplateField>
             <ItemTemplate>
    	  <asp:label ID="lblSobrenome" runat="server" text='<%# DataBinder.Eval(Container.DataItem, "campo2")%>' /> 
             </ItemTemplate> 
    	</asp:TemplateField>
     </Columns> 
    </asp:GridView>

    E por ai vai sugiro que estude os controles vc vai perceber que não é dificil trabalhar com eles.

    Abraço!


    Nome : Romy G. Moura Cargo: Analista Programador

    terça-feira, 19 de agosto de 2014 16:29
  • Jhonathan Maia

    tem algumas onfomações aqui.

    http://www.macoratti.net/10/03/c_lvds.htm

    http://dicarapida.wordpress.com/2011/04/29/como-popular-um-datagridview-com-dados-de-uma-classe/

    o que voce tambem pode fazer, é preencher o datagridview atraves do dataSource e com um laço pegar as informaçoes no List e carregar no grid.

    ok

    terça-feira, 19 de agosto de 2014 16:33
  • Bruno, e demais amigos que responderam a esta pergunta agradeço a ajuda.

    Porem o DataSource não carrega as informações do objeto dentro da minha classe Aluno, ou seja ele não exibe as informações de PessoaFisica.

    Minha classe Aluno está assim:

    public int idAluno { get; set; }
    public PessoaFisica pFisica { get; set; }
    //Construtor da classe Aluno
    public Aluno()
    {
        pFisica = new PessoaFisica();
    }

    Para criar uma lista de Alunos estou fazendo assim:

    DataTable dataTable = acessoSql.ExecutarConsulta(CommandType.StoredProcedure, "uspAlunoConsultar");
    foreach (DataRow linha in dataTable.Rows)
    {
    	Aluno aluno = new Aluno();
            aluno.idAluno = Convert.ToInt32(linha["IDAluno"]);
            aluno.pFisica.nome = Convert.ToString(linha["Nome"]);
            aluno.pFisica.sexo = Convert.ToBoolean(linha["Sexo"]);
            aluno.pFisica.cpf = Convert.ToString(linha["CpfCnpj"]);
            aluno.pFisica.cep = Convert.ToString(linha["Cep"]);
            aluno.pFisica.logradouro = Convert.ToString(linha["Logradouro"]);
            aluno.pFisica.cidade = Convert.ToString(linha["Cidade"]);
            aluno.pFisica.email = Convert.ToString(linha["EmailSite"]);
    
            colecaoAluno.Add(aluno);
    }
    return colecaoAluno;

    Porem quando coloco colecaoAluno como datasourse do grid ele exibe apenas o idAluno, o resto fica em branco.

    Teria alguma outra idéia, ou esta faltando eu fazer algo?

    Vlw.

    terça-feira, 19 de agosto de 2014 19:25
  • Cara cade a instancia do objeto colecaoAluno?

    List<Aluno> colecaoAluno = new List<Aluno>(); 

    colecaoAluno.Add(aluno);

    depois de usar o datasource é preciso ter o método databinder.



    Nome : Romy G. Moura Cargo: Analista Programador

    terça-feira, 19 de agosto de 2014 19:41
  • Olá, acredito que setando o DataSource não tem como as propriedades da pessoaFisica aparecerem no DataGridView, talvez você tenha que fazer manualmente passando em todas as propriedades da PessoaFisica e criar uma colunada para cada.

    Só estou com uma dúvida referente ao seu objeto PessoaFisica dentro de Aluno, qual é o proposito dele?

    Abraço!




    terça-feira, 19 de agosto de 2014 19:46
  • Ops eu não coloquei no código mais eu tenho logo acima do foreach, este método databinder não conheço ele, uma coisa que tambem esqueci de citar é que meu projeto é windows form não é ASP.

    Vlw.

    terça-feira, 19 de agosto de 2014 20:07
  • Eu fiz uma modularização do meu BD, então lá eu tenho uma tblPessoaFisica e uma Aluno, Aluno por sua vez é uma PessoaFisica, e no banco tenho uma relação PK_FK entre estas duas tabelas.

    Se não teria que ficar repetindo os mesmo campos da tblPessoaFisica em todas as tabelas que são refentes a este tipo de pessoa desta forma crio uma pessoaFisica e as demais só incremento oque não tem lá!

    Isso é uma boa? rsrs

    terça-feira, 19 de agosto de 2014 20:10
  • Já pensou em usar a herança? Aluno herdar as propriedades da PessoaFisica, isso foge do teu propósito?


    terça-feira, 19 de agosto de 2014 20:37
  • O problema da herança é que foge do principio de encapsulamento, pesquisei bastante em diversos foruns e todos disseram a mesma coisa que herança não é uma boa prática em POO principalmente para este usa com PessoaFisica, Juridica, e classes que as utilizam. Não sou nenhum expecialista em OO mais como vi diversas pessoas falando isso nem utilizei herança, sei que seria bem mais simples concordo com isso, porem talvez troucesse problemas posteriores rsrsrsrs.

    terça-feira, 19 de agosto de 2014 20:40
  • Te entendi, tu preferiu usar composição ao invés de herança, então dessa maneira acredito que tu vai ter que fazer manual mesmo, como coloquei na resposta acima.

    Abraço!

    terça-feira, 19 de agosto de 2014 20:43
  • Então o problema ta ai, como eu preencho um gridview manualmente com um List?

    Se puder colocar um exemplo de como fazer, pq realmente nunca fiz. 

    Vlw

    terça-feira, 19 de agosto de 2014 21:39
  • Uma maneira que você pode fazer é criando propriedades para pegar e setar os valores da variável pessoa, segue abaixo.

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                List<Aluno> a = new List<Aluno>();
                a.Add(new Aluno() { PessoaName = "Aluno1", PessoaIdade = 10, Grade = "1", Matricula = "123" });
                a.Add(new Aluno() { PessoaName = "Aluno2", PessoaIdade = 20, Grade = "2", Matricula = "456" });
                a.Add(new Aluno() { PessoaName = "Aluno3", PessoaIdade = 30, Grade = "3", Matricula = "789" });
                a.Add(new Aluno() { PessoaName = "Aluno4", PessoaIdade = 40, Grade = "4", Matricula = "987" });
    
                this.dataGridView1.DataSource = a;
            }
        }
    
        public class Aluno
        {
            public Aluno()
            {
                this.Pessoa = new Pessoa();
            }
    
            public string Grade { get; set; }
    
            public string Matricula { get; set; }
    
            public string PessoaName
            {
                get
                {
                    return this.Pessoa.Name;
                }
                set
                {
                    this.Pessoa.Name = value;
                }
            }
    
            public int PessoaIdade
            {
                get
                {
                    return this.Pessoa.Idade;
                }
                set
                {
                    this.Pessoa.Idade = value;
                }
            }
    
            private Pessoa Pessoa { get; set; }
        }
    
        public class Pessoa
        {
            public string Name { get; set; }
    
            public int Idade { get; set; }
        }

    quarta-feira, 20 de agosto de 2014 11:19
  • Bruno fiz desta forma e funcionou perfeitamente, porem desse jeito que apenas não estaria repitindo as variaveis da classe pessoafisica?

    De qualquer forma irei manter este método foi bem facil de fazer rsrsr

    Agradeço sua ajuda.

    Abraço.

    quarta-feira, 20 de agosto de 2014 14:16
  • Sim, estaria repetindo, caso você usasse herança, não teria a necessidade.

    De qualquer forma o código acima é justamente para atender sua necessidade, conforme seu conhecimento sobre a linguagem vai melhorando, com certeza você pode melhorar.

    Abraço!

    quarta-feira, 20 de agosto de 2014 14:40