Não é possível obter valor da checkbox de combinação

Eu tenho um comboBox simples com alguns itens de valor / texto nele. Eu tenho usando ComboBox.DisplayMember e ComboBox.ValueMember para definir corretamente o valor / texto. Quando tento obter o valor, ele retorna uma string vazia. Aqui está meu código:

Evento FormLoad:

cbPlayer1.ValueMember = "Value"; cbPlayer1.DisplayMember = "Text"; 

SelectIndexChanged do evento ComboBox:

 cbPlayer1.Items.Add(new { Value = "3", Text = "This should have a value of 3" }); MessageBox.Show(cbPlayer1.SelectedValue+""); 

E isso retorna uma checkbox de diálogo vazia. Eu também tentei o ComboBox.SelectedItem.Value (que o VS vê, veja a imagem) mas ele não compila:

 'object' does not contain a definition for 'Value' and no extension method 'Value' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?) 

texto alternativo

O que estou fazendo de errado?

Não tem certeza do que significa ComboBox.SelectedValue, ele tem uma propriedade SelectedItem. Isso não seria definido quando você adicionasse um item, apenas quando o usuário fizer uma seleção.

A propriedade Items é uma coleção de System.Object. Isso permite que uma checkbox de combinação armazene e exiba qualquer tipo de object de class. Mas você terá que converter o object para o seu tipo de class para usar o object selecionado no seu código. Isso não funciona no seu caso, você adicionou um object de um tipo anônimo. Você precisará declarar uma pequena class auxiliar para armazenar as propriedades Value e Text. Algum código de amostra:

  public partial class Form1 : Form { public Form1() { InitializeComponent(); comboBox1.Items.Add(new Item(1, "one")); comboBox1.Items.Add(new Item(2, "two")); comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged); } void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { Item item = comboBox1.Items[comboBox1.SelectedIndex] as Item; MessageBox.Show(item.Value.ToString()); } private class Item { public Item(int value, string text) { Value = value; Text = text; } public int Value { get; set; } public string Text { get; set; } public override string ToString() { return Text; } } } 

Como você viu no depurador, SelectedItem contém as informações que você precisa. Mas para acessar SelectedItem.Value, você precisa converter SelectedItem para o tipo apropriado (o que é problemático se você estiver usando um tipo anônimo) ou usar reflection. (VS não pode compilar SelectedItem.Value porque em tempo de compilation VS só sabe que SelectedItem é do tipo Object, que não tem uma propriedade Value.)

Para usar a reflection para obter o membro Value, use Type.InvokeMember com BindingFlags.GetProperty.

Para converter SelectedItem, declare um tipo nomeado com propriedades de valor e texto em vez de usar um tipo anônimo e adicione instâncias do tipo nomeado para o ComboBox, em vez de instâncias do tipo anônimo. Em seguida, casting SelectedItem: ((MyType) (cb.SelectedItem)). Valor.

Não tenho certeza porque o SelectedValue não retorna nada … Eu suponho que isso pode ser devido ao fato de que você não está usando a vinculação de dados ( DataSource ). Você deve tentar atribuir uma lista de cartões à propriedade DataSource .

Em relação ao problema com SelectedItem : ComboBox.SelectedItem é do tipo Object , que não tem uma propriedade chamada Value . Você precisa lançá-lo no tipo do item; mas como é um tipo anônimo, você não pode … você deve provavelmente criar um tipo para conter o valor e o texto do cartão e converter para este tipo:

 Card card = ComboBox.SelectedItem as Card; if (card != null) { // do something with card.Value } 

Você está modificando o conteúdo da checkbox de combinação no manipulador SelectedIndexChanged. Quando você modifica o conteúdo, isso faz com que os itens selecionados sejam desconfigurados. Definir que você está lendo em null, que é exibido na checkbox de mensagens como uma string vazia.

Estou curioso para saber se você está ligando a checkbox de combinação a uma coleção ou preenchendo-a manualmente. Se você estiver vinculando a checkbox de combinação a uma fonte de dados de algum tipo … você deve adicionar itens à fonte de dados, não à própria checkbox de combinação. Quando um item é adicionado à fonte de dados, a checkbox de combinação deve ser atualizada em espécie.

Se você não estiver vinculando, adicionar um item não fará com que esse item seja selecionado. Você precisaria aguardar o usuário selecionar o item ou selecionar programaticamente o item no código.

Para evitar ter que criar uma nova class para todas as suas checkboxs de combinação, sugiro que você use apenas um KeyValuePair, como no exemplo a seguir:

 cbPlayer1.ValueMember = "Value"; cbPlayer1.DisplayMember = "Key"; cbPlayer1.DataSource = new List>() {new KeyValuePair("3","This should have the value of 3")}; 

Você ainda precisa converter o valor selecionado

 string selectedValue = (string)cbPlayer1.SelectedValue; MessageBox.Show(selectedValue);