none
Propriedade Dinamica RRS feed

  • Pergunta

  • Pessoal,

    Criei um controle grid porém quero dar as opções do usuário selecionar as colunas que deseja adicionar...essas colunas são exibidas com base num select.

     

    Seria um property builder personalizado

     

    quinta-feira, 29 de setembro de 2011 15:39

Todas as Respostas

  • Bom dia Elemento Y, então fiz um exemplo aqui que acredito que seja o que vc deseja fazer porém não tenho certeza se essa é a maneira correta de fazer (*aceito sugestões/críticas dos colegas sobre o que fiz, pois nunca precisei fazer isto em uma solução, portanto não sei se é a melhor maneira de fazê-lo), o código funciona, e claro é um simples exemplo que deve ser melhorado/otimizado de acordo com sua necessidade.

    Bom abaixo segue as telas, o bd e o code todo comentado, resumindo o que fiz foi colocar em um form um DataGridView e um CheckedLIstBox com os itens que o usuário pode escolher para ser exibido no DataGridView assim, de acordo com a escolha carrego o grid e exibo somente o que foi escolhido, alimentando o DataGridView com um de List<Cliente>, segue:

    Diagrama Bd:
    Código CS:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace GridComColunasDinamicas
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            //Classe Cliente com suas propriedades
            public class Cliente
            {
                public int Codigo { get; set; }
                public string Nome { get; set; }
                public string Endereco { get; set; }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            //Método privado para carregar o grid
            private void CarregarGrid()
            {
                //limpo todas as colunas do grid
                dgvClientes.Columns.Clear();
                //seto a prorpiedade autogeneration
                //colums pra false
                dgvClientes.AutoGenerateColumns = false;
                //percorro os itens marcados do meu checkedlistbox
                foreach (var item in checkedListBox1.CheckedItems)
                {
                    //verifico qual item foi marcado
                    //e de acordo com o item adiciono
                    //colunas ao datagridview
                    if (item.ToString() == "Codigo")
                    {
                        //instância da coluna
                        DataGridViewColumn coluna1 = new DataGridViewColumn();
                        //instância da celula e seu tipo
                        //no meu caso utilizei o tipo textbox
                        DataGridViewCell cell = new DataGridViewTextBoxCell();
                        //adiciono o template a coluna
                        coluna1.CellTemplate = cell;
                        //seto o nome da coluna
                        coluna1.Name = "codigo";
                        //o header text do grid
                        coluna1.HeaderText = "Código";
                        //e o dataproperty que será a propriedade
                        //da lista retornada que será exibida
                        //ou seja a propriedade da minha classe
                        coluna1.DataPropertyName = "Codigo";
                        //seto o tamanho da coluna
                        coluna1.Width = 100;
                        //adiciono a coluna ao grid
                        dgvClientes.Columns.Add(coluna1);
                    }
                    if (item.ToString() == "Nome")
                    {
                        DataGridViewColumn coluna2 = new DataGridViewColumn();
                        DataGridViewCell cell = new DataGridViewTextBoxCell();
                        coluna2.CellTemplate = cell;
                        coluna2.Name = "Nome";
                        coluna2.HeaderText = "Nome";
                        coluna2.DataPropertyName = "Nome";
                        coluna2.Width = 150;
                        dgvClientes.Columns.Add(coluna2);
                    }
                    if (item.ToString() == "Endereço")
                    {
                        DataGridViewColumn coluna3 = new DataGridViewColumn();
                        DataGridViewCell cell = new DataGridViewTextBoxCell();
                        coluna3.CellTemplate = cell;
                        coluna3.Name = "Endereco";
                        coluna3.HeaderText = "Endereco";
                        coluna3.DataPropertyName = "Endereco";
                        coluna3.Width = 150;
                        dgvClientes.Columns.Add(coluna3);
                    }
                }
                //seto a lista retornada pelo método 
                //ObterLIsta() como o datasource do grid
                dgvClientes.DataSource = ObterLista();
            }
    
            //Método privado que retorna um list de Clientes
            private List<Cliente> ObterLista()
            {
                //instância da lista que será 
                //retornada
                List<Cliente> lista = new List<Cliente>();
                //instância da conexão passando a 
                //connectiostring como parâmetro
                SqlConnection conn = new SqlConnection(@"Data Source=ZÉGOIABA-PC\sqlexpress;Initial Catalog=DBTeste;Integrated Security=True;Pooling=False");
                //query com o comando select
                string query = "SELECT Id, Nome, Endereco FROM Clientes";
                //instância do comando onde passo
                //a query e a conexão copmo parâmetro
                SqlCommand cmd = new SqlCommand(query, conn);
                //abro conexão
                conn.Open();
                //instância do leitor que recebe
                //o reader()
                SqlDataReader leitor = cmd.ExecuteReader();
                //se há linhas
                if (leitor.HasRows)
                {
                    //enquanto leitor lê
                    while (leitor.Read())
                    {
                        //instância de um novo cliente
                        Cliente c = new Cliente();
                        //capturo as informações do bd com o leitor
                        c.Codigo = Convert.ToInt32(leitor["Id"]);
                        c.Nome = leitor["Nome"].ToString();
                        c.Endereco = leitor["Endereco"].ToString();
                        //Adiciono o objeto a lista
                        lista.Add(c);
                    }
                }
                //fecho conexão
                conn.Close();
                //retoirno a lista
                return lista;
            }
    
            //Evento selecteditem do checkedlistbox onde chamo o
            //método que carrega o grid e adiciona as colunas
            private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                CarregarGrid();
            }
        }
    }
    
    


    Resultado obtido:
    Abraços e espero ter ajudado!

    Estudar, Estudar e Estudar! Não existe caminho curto.
    sexta-feira, 30 de setembro de 2011 14:06