valor - obtener el valuemember de un combobox c#
No se puede obtener el valor de ComboBox (6)
Como ha visto en el depurador, SelectedItem contiene la información que necesita. Pero para acceder a SelectedItem.Value, debe enviar SelectedItem al tipo apropiado (que es problemático si está usando un tipo anónimo) o usar reflection. (VS no puede compilar SelectedItem.Value porque en tiempo de compilación VS solo sabe que SelectedItem es del tipo Object, que no tiene una propiedad Value).
Para usar la reflexión para obtener el miembro Value, use Type.InvokeMember con BindingFlags.GetProperty.
Para moldear SelectedItem, declare un tipo con nombre con propiedades Value y Text en lugar de usar un tipo anónimo, y agregue instancias del tipo con nombre al ComboBox, en lugar de instancias del tipo anónimo. Luego, eche SelectedItem: ((MyType) (cb.SelectedItem)). Value.
Tengo un comboBox simple con algunos elementos de valor / texto. Tengo el uso de ComboBox.DisplayMember y ComboBox.ValueMember para establecer correctamente el valor / texto. Cuando trato de obtener el valor, devuelve una cadena vacía. Aquí está mi código:
Evento FormLoad:
cbPlayer1.ValueMember = "Value";
cbPlayer1.DisplayMember = "Text";
Evento SelectIndexChanged of ComboBox:
cbPlayer1.Items.Add(new { Value = "3", Text = "This should have a value of 3" });
MessageBox.Show(cbPlayer1.SelectedValue+"");
Y devuelve un cuadro de diálogo vacío. También probé ComboBox.SelectedItem.Value (que VS ve, ve la imagen) pero no 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?)
¿Qué estoy haciendo mal?
Está modificando el contenido de ComboBox en el controlador SelectedIndexChanged. Cuando modifica los contenidos, causa que los elementos seleccionados sean desarmados. Establece que está leyendo en nulo, que se muestra en el cuadro de mensaje como una cadena vacía.
No estoy seguro de por qué SelectedValue
no devuelve nada ... Supongo que podría deberse al hecho de que no está utilizando el enlace de datos ( DataSource
). Debería intentar asignar una lista de tarjetas a la propiedad DataSource
.
Respecto al problema con SelectedItem
: ComboBox.SelectedItem
es de tipo Object
, que no tiene una propiedad llamada Value
. Necesitas lanzarlo al tipo de elemento; pero dado que es un tipo anónimo, no se puede ... probablemente debería crear un tipo para contener el valor y el texto de la tarjeta, y convertirlo a este tipo:
Card card = ComboBox.SelectedItem as Card;
if (card != null)
{
// do something with card.Value
}
No estoy seguro de qué significa ComboBox.SelectedValue, tiene una propiedad SelectedItem. Eso no se establecería cuando agregue un artículo, solo cuando el usuario haga una selección.
La propiedad Items es una colección de System.Object. Eso permite que un cuadro combinado almacene y muestre cualquier tipo de objeto de clase. Pero tendrá que convertirlo de un objeto a su tipo de clase para usar el objeto seleccionado en su código. Eso no puede funcionar en su caso, ha agregado un objeto de tipo anónimo. Deberá declarar una pequeña clase de ayuda para almacenar las propiedades de Valor y Texto. Algunos ejemplos de código:
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; }
}
}
Tengo curiosidad de si está vinculando el cuadro combinado a una colección, o llenándolo manualmente. Si está vinculando el cuadro combinado a una fuente de datos de algún tipo ... debería agregar elementos a la fuente de datos, no al cuadro combinado en sí. Cuando se agrega un elemento a la fuente de datos, el cuadro combinado debe actualizarse en tipo.
Si no es vinculante, agregar un elemento no hará que ese elemento sea seleccionado. Debería esperar a que el usuario seleccione el elemento, o seleccionar el elemento programáticamente en el código.
Para evitar tener que crear una nueva clase para todos sus cuadros combinados, le sugiero que simplemente use un KeyValuePair como en el siguiente ejemplo:
cbPlayer1.ValueMember = "Value";
cbPlayer1.DisplayMember = "Key";
cbPlayer1.DataSource = new List<KeyValuePair<string,string>>()
{new KeyValuePair<string,string>("3","This should have the value of 3")};
Aún necesita lanzar el valor seleccionado
string selectedValue = (string)cbPlayer1.SelectedValue;
MessageBox.Show(selectedValue);