Crie opções de lista suspensa de enum em um DataGridView
-
09-06-2019 - |
Pergunta
Atualmente tenho uma classe e estou tentando criar uma GUI fácil para criar uma coleção dessa classe.A maioria dos atributos desta classe são strings.Porém, um dos atributos que desejo que o usuário possa definir é um Enum.Portanto, gostaria que a interface do usuário tivesse uma lista suspensa para esta enumeração, para restringir o usuário de inserir um valor que não seja válido.Atualmente estou pegando a lista inicial de objetos, adicionando-os em um DataTable e configurando o DataSource do meu DataGridView para a tabela.Funciona bem, até cria uma coluna de caixa de seleção para uma propriedade booleana.Mas não sei como transformar a coluna do enum em uma lista suspensa.Estou usando C# e .NET 2.0.
Além disso, tentei atribuir o DataSource do DataGridView à lista dos meus objetos, mas quando faço isso, não ajuda com o enum e não consigo criar novas linhas no DataGridView, mas definitivamente não estou obrigado a usar um DataTable como meu DataSource, era simplesmente a opção que tenho semi-funcionando.
Solução
Não sei se isso funcionaria com uma coluna DataGridView mas funciona com ComboBoxes:
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
e:
MyEnum value = (MyEnum)comboBox1.SelectedValue;
ATUALIZAR:Também funciona com colunas DataGridView, apenas lembre-se de definir o tipo de valor.
DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
col.Name = "My Enum Column";
col.DataSource = Enum.GetValues(typeof(MyEnum));
col.ValueType = typeof(MyEnum);
dataGridView1.Columns.Add(col);
Outras dicas
Ou, se precisar filtrar os valores do enumerador, você pode percorrer Enum.GetValues(typeof(EnumeratorName))
e adicione os que você deseja usando:
dataGridViewComboBoxColumn.Items.Add(EnumeratorValue)
Além disso, em vez de usar um DataTable, você pode definir o DataSource do DataGridView como um objeto BindingSource, com o DataSource do objeto BindingSource definido como um BindingList<Your Class>
, que você preenche passando um IList
no construtor.
Na verdade, eu estaria interessado em saber de alguém se isso é preferível a usar um DataTable em situações em que você ainda não possui um (ou seja,ele é retornado de uma chamada de banco de dados).
if(e.KeyCode == Keys.Oem3)
{
}
Isso funcionou para mim