Inquiridor
Propriedade Dinamica

Pergunta
-
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.