muitas pessoas responderam à pergunta de como vincular uma enumeração a uma caixa de combinação no WinForms. É tipo isso:
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
Mas isso é bastante inútil sem poder definir o valor real a ser exibido.
Eu tentei:
comboBox1.SelectedItem = MyEnum.Something; // Does not work. SelectedItem remains null
Eu também tentei:
comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); // ArgumentOutOfRangeException, SelectedIndex remains -1
Alguém tem alguma idéia de como fazer isso?
SelectedValue
causa um problemaInvalidOperationException
para mim. "Não é possível definir oSelectedValue
em aListControl
com um vazioValueMember
."Respostas:
The Enum
Definindo os valores suspensos a partir dele
Obtendo a enumeração do item selecionado
fonte
Para simplificar:
Primeiro inicialize este comando: (por exemplo, depois
InitalizeComponent()
)Para recuperar o item selecionado na caixa de combinação:
Se você deseja definir um valor para a caixa de combinação:
fonte
O código
está ok, o problema deve residir no DataBinding. As atribuições de ligação de dados ocorrem após o construtor, principalmente na primeira vez em que a caixa de combinação é exibida. Tente definir o valor no evento Load. Por exemplo, adicione este código:
E verifique se funciona.
fonte
Experimentar:
EDITAR% S:
Opa, você já tentou isso. No entanto, funcionou para mim quando meu comboBox foi definido como DropDownList.
Aqui está o meu código completo que funciona para mim (com o DropDown e o DropDownList):
fonte
Digamos que você tenha a seguinte enumeração
Você precisa ter uma estrutura para mapear esses valores para uma sequência:
Agora retorne uma matriz de objetos com todas as enumerações mapeadas para uma string:
E use o seguinte para preencher sua caixa de combinação:
Crie uma função para recuperar o tipo de enumeração, caso você queira passá-la para uma função
e então você deve ficar bem :)
fonte
Tuple
). Eu transformaria o valor do enum e a descrição em propriedades e, em seguida, adicionaria anumberCB.DisplayProperty = "Caption"
; `enumberCB.ValueProperty = "Num"
para que você possa usarSelectedValue
diretamente e vincular a ele.Tente o seguinte:
StoreObject é meu exemplo de objeto com a propriedade StoreObjectMyEnumField para o valor da loja MyEnum.
fonte
fonte
esta é a solução para carregar o item de enum na caixa de combinação:
E, em seguida, use o item enum como texto:
fonte
Com base na resposta de @Amir Shenouda, termino com isso:
Definição de Enum:
Definindo os valores suspensos a partir dele:
Obtendo a enumeração do item selecionado:
fonte
fonte
Fonte completa ... Vinculando uma enumeração à caixa de combinação
fonte
Eu uso o seguinte método auxiliar, que você pode vincular à sua lista.
fonte
Converta o enum em uma lista de strings e adicione-o ao comboBox
Defina o valor exibido usando selectedItem
fonte
Nenhuma delas funcionou para mim, mas funcionou (e teve o benefício adicional de poder ter uma descrição melhor para o nome de cada enumeração). Não tenho certeza se é devido a atualizações .net ou não, mas, independentemente disso, acho que essa é a melhor maneira. Você precisará adicionar uma referência a:
using System.ComponentModel;
Então, quando você quiser acessar os dados, use estas duas linhas:
fonte
Isso provavelmente nunca será visto entre todas as outras respostas, mas esse é o código que eu criei, isso tem o benefício de usar o método
DescriptionAttribute
se ele existir, mas de outro modo o nome do próprio valor da enumeração.Eu usei um dicionário porque ele tem um padrão de item de chave / valor pronto. UMA
List<KeyValuePair<string,object>>
também funcionaria e sem o hash desnecessário, mas um dicionário contribui para um código mais limpo.Recebo membros que têm um
MemberType
dosField
e que são literal. Isso cria uma sequência de apenas membros que são valores de enumeração. Isso é robusto, pois uma enumeração não pode ter outros campos.fonte
deve funcionar muito bem ... Como você pode dizer que
SelectedItem
é nulo?fonte
Você pode usar as funções "FindString ..":
fonte
Você pode usar uma lista de valores KeyValuePair como fonte de dados para a caixa de combinação. Você precisará de um método auxiliar em que possa especificar o tipo de enum e ele retornará IEnumerable> em que int é o valor de enum e string é o nome do valor de enum. Na sua caixa de combinação, defina a propriedade DisplayMember como 'Key' e a propriedade ValueMember como 'Value'. Valor e Chave são propriedades públicas da estrutura KeyValuePair. Em seguida, quando você define a propriedade SelectedItem como um valor de enum, como você está fazendo, ela deve funcionar.
fonte
No momento, estou usando a propriedade Items em vez do DataSource, significa que tenho que chamar Add para cada valor de enumeração, mas é uma enumeração pequena e seu código temporário de qualquer maneira.
Então eu posso apenas fazer o Convert.ToInt32 no valor e defini-lo com SelectedIndex.
Solução temporária, mas YAGNI por enquanto.
Felicidades pelas idéias, provavelmente as usarei quando fizer a versão correta depois de receber uma rodada de comentários dos clientes.
fonte
Questão antiga, talvez aqui, mas eu tinha o problema e a solução era fácil e simples, achei isso http://www.c-sharpcorner.com/UploadFile/mahesh/1220/
Ele faz uso da conexão de dados e funciona muito bem, então confira.
fonte
Ambos funcionam para mim. Tem certeza de que não há mais nada errado?
fonte
enum MyEnum { Something = 47 }
Método genérico para definir uma enumeração como fonte de dados para menus suspensos
O display seria o nome. O valor selecionado seria o próprio Enum
fonte
Isso sempre foi um problema. se você tiver um Enum classificado, como de 0 a ...
você pode vincular nomes à caixa de combinação e, em vez de usar o
.SelectedValue
uso da propriedade.SelectedIndex
e a
fonte
No Framework 4, você pode usar o seguinte código:
Para ligar o MultiColumnMode enum à caixa de combinação, por exemplo:
e para obter o índice selecionado:
Nota: Eu uso a caixa de combinação DevExpress neste exemplo, você pode fazer o mesmo na caixa de combinação Win Form
fonte
Um pouco atrasado para esta festa,
O método SelectedValue.ToString () deve receber o DisplayedName. No entanto, este artigo DataBinding Enum e também With Descriptions mostra uma maneira útil de não apenas ter isso, mas, em vez disso, você pode adicionar um atributo de descrição personalizado à enum e usá-lo como valor exibido, se preferir. Muito simples e fácil e cerca de 15 linhas de código (a menos que você conte os chavetas) para tudo.
É um código bastante bacana e você pode torná-lo um método de extensão para inicializar ...
fonte
use somente a transmissão desta maneira:
fonte
Você pode usar um método de extensão
Como usar ... Declare enum
Este método mostra a descrição nos itens da caixa de combinação
fonte
Isso funcionou para mim:
fonte