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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top