none
TypeConverter que mostra opções de enum em forma de comboBox no DataGridView RRS feed

  • 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?

    terça-feira, 4 de janeiro de 2011 17:47

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
    domingo, 9 de janeiro de 2011 15:36

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
    domingo, 9 de janeiro de 2011 15:36
  • 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
    sexta-feira, 14 de janeiro de 2011 12:49