Usuário com melhor resposta
TypeConverter que mostra opções de enum em forma de comboBox no DataGridView

Pergunta
-
Eu tenho a seguinte classe:
public class Marca { #region Atributos /// <summary> /// Id do objeto no banco de dados. /// </summary> private int id; /// <summary> /// Nome da marca. /// </summary> private string nome; #endregion #region Propriedades /// <summary> /// Seta ou retorna o Id do objeto no banco de dados. /// </summary> [Browsable(false)] public int Id { get { return id; } set { id = value; } } /// <summary> /// Seta ou retorna o Nome da marca. /// </summary> [CategoryAttribute("Dados da marca"), DefaultValueAttribute("")] [Description("Indica o nome da marca.")] [DisplayName("Nome")] public string Nome { get { return nome; } set { nome = value.Trim(); } } [CategoryAttribute("Dados da marca"), DefaultValueAttribute("")] [Description("Indica se a marca foi aprovada.")] [DisplayName("Aprovada a marca")] public EnumSimNao Aprovada { get { return aprovada; } set { aprovada = value; } } #endregion }
Meu objetivo é criar um dataGridView que receba um List<Marca> como dataSource e que possa ser editado, mas gostaria que o dataGridView durante a edição da propriedade Aprovada mostrasse uma caixa de seleção com as opções do enum ao invés de permitir digitar um valor. Preciso criar ou usar algum tipo de atributo como o TypeConverter ou EditorAttribute que faça com que o dataGridView crie uma coluna do tipo ComboBox ao invés de um coluna do tipo textBox. Alguém sabe como fazer isto?
Respostas
-
Olá Paulo,
Como só o nome da enumeração EnumSimNao, estou entendendo que os seus valores são Sim ou Não, desta forma eu sugiro o simples uso de um boolean?, perceba que o símbolo "?" faz com que eu use o tipo Nullable.
Mas se o intuito for ter mais valores nesta enum, como "Sim, Nao e Pendente", então você precisa adicionar todas as colunas no dataGridView, sendo que a coluna para o enum será do tipo DataGridViewComboBoxColumn com "DataSource = Enum.GetValues(typeof(EnumSimNao));".
public partial class Form1 : Form { DataGridViewTextBoxColumn colNome; DataGridViewComboBoxColumn colAprovada; public Form1() { InitializeComponent(); LoadGridColumns(); } private void LoadGridColumns() { colNome = new DataGridViewTextBoxColumn(); colNome.HeaderText = "Nome"; colNome.DataPropertyName = "Nome"; colAprovada = new DataGridViewComboBoxColumn(); colAprovada.HeaderText = "Aprovada"; colAprovada.DataPropertyName = "Aprovada"; colAprovada.DataSource = Enum.GetValues(typeof(EnumSimNao)); dataGridView1.AutoGenerateColumns = false; dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.colNome, this.colAprovada}); } private void Form1_Load(object sender, EventArgs e) { List<Marca> list = new List<Marca>(); Marca item1 = new Marca(); item1.Id = 1; item1.Nome = "Microsoft"; item1.Aprovada = EnumSimNao.Sim; list.Add(item1); Marca item2 = new Marca(); item2.Id = 2; item2.Nome = "New Logo"; list.Add(item2); dataGridView1.DataSource = list; } } public enum EnumSimNao { Pendente, Sim, Nao }
[]'s
[]'s, Prentice Mesquita- Marcado como Resposta paulo3011 sexta-feira, 14 de janeiro de 2011 12:49
Todas as Respostas
-
Olá Paulo,
Como só o nome da enumeração EnumSimNao, estou entendendo que os seus valores são Sim ou Não, desta forma eu sugiro o simples uso de um boolean?, perceba que o símbolo "?" faz com que eu use o tipo Nullable.
Mas se o intuito for ter mais valores nesta enum, como "Sim, Nao e Pendente", então você precisa adicionar todas as colunas no dataGridView, sendo que a coluna para o enum será do tipo DataGridViewComboBoxColumn com "DataSource = Enum.GetValues(typeof(EnumSimNao));".
public partial class Form1 : Form { DataGridViewTextBoxColumn colNome; DataGridViewComboBoxColumn colAprovada; public Form1() { InitializeComponent(); LoadGridColumns(); } private void LoadGridColumns() { colNome = new DataGridViewTextBoxColumn(); colNome.HeaderText = "Nome"; colNome.DataPropertyName = "Nome"; colAprovada = new DataGridViewComboBoxColumn(); colAprovada.HeaderText = "Aprovada"; colAprovada.DataPropertyName = "Aprovada"; colAprovada.DataSource = Enum.GetValues(typeof(EnumSimNao)); dataGridView1.AutoGenerateColumns = false; dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.colNome, this.colAprovada}); } private void Form1_Load(object sender, EventArgs e) { List<Marca> list = new List<Marca>(); Marca item1 = new Marca(); item1.Id = 1; item1.Nome = "Microsoft"; item1.Aprovada = EnumSimNao.Sim; list.Add(item1); Marca item2 = new Marca(); item2.Id = 2; item2.Nome = "New Logo"; list.Add(item2); dataGridView1.DataSource = list; } } public enum EnumSimNao { Pendente, Sim, Nao }
[]'s
[]'s, Prentice Mesquita- Marcado como Resposta paulo3011 sexta-feira, 14 de janeiro de 2011 12:49
-
legal Prentice, queria que você automático tipo como acontece com a propertyGrid a propertyGrid identifica os atributos como CategoryAttribute, Description e usa para monter a grid de propriedade. Mas esta maneira que passou é uma solução. Obrigado.
Paulo Moreira