Obtenga el valor de un elemento de cuadro de lista por índice

Esto debe ser muy fácil, pero estoy atascado. Tengo un listBox con X Items. Cada elemento tiene una descripción de texto (que aparece en el listBox) y su valor (numérico). Quiero poder obtener la propiedad de valor de un artículo, usando el número de índice del artículo.

Podría ser

String MyStr = ListBox.items[5].ToString(); 

Aquí no puedo ver ni una sola respuesta correcta para esta pregunta (en la etiqueta WinForms) y es extraño para una pregunta tan frecuente.

Los elementos de un control ListBox pueden ser DataRowView , Objetos complejos, Tipos anónimos, tipos primarios y otros tipos. El valor subyacente de un artículo se debe calcular en base a ValueMember .

ListBox control ListBox tiene un GetItemText que le ayuda a obtener el texto del elemento independientemente del tipo de objeto que haya agregado como elemento. Realmente necesita dicho método GetItemValue .

Método de extensión GetItemValue

Podemos crear el método de extensión GetItemValue para obtener el valor del artículo que funciona como GetItemText :

 using System; using System.Windows.Forms; using System.ComponentModel; public static class ListControlExtensions { public static object GetItemValue(this ListControl list, object item) { if (item == null) throw new ArgumentNullException("item"); if (string.IsNullOrEmpty(list.ValueMember)) return item; var property = TypeDescriptor.GetProperties(item)[list.ValueMember]; if (property == null) throw new ArgumentException( string.Format("item doesn't contain '{0}' property or column.", list.ValueMember)); return property.GetValue(item); } } 

Usando el método anterior, no necesita preocuparse por la configuración de ListBox y devolverá el Value esperado para un elemento. Funciona con List , Array , ArrayList , DataTable , Lista de tipos anónimos, lista de tipos primarios y todas las demás listas que puede usar como fuente de datos. Aquí hay un ejemplo de uso:

 //Gets underlying value at index 2 based on settings this.listBox1.GetItemValue(this.listBox1.Items[2]); 

Como creamos el método GetItemValue como método de extensión, cuando desee usar el método, no olvide incluir el espacio de nombres en el que coloca la clase.

Este método es aplicable también en ComboBox y CheckedListBox .

Si está trabajando en un proyecto de formularios de Windows, puede intentar lo siguiente:

Agregue elementos a ListBox como objetos KeyValuePair :

 listBox.Items.Add(new KeyValuePair(key, value); 

Luego podrá recuperarlos de la siguiente manera:

 KeyValuePair keyValuePair = listBox.Items[index]; var value = keyValuePair.Value; 

Estoy usando un BindingSource con un SqlDataReader detrás de él y ninguno de los anteriores funciona para mí.

Pregunta para Microsoft: ¿Por qué funciona esto?

  ? lst.SelectedValue 

Pero esto no?

  ? lst.Items[80].Value 

Encuentro que debo volver al objeto BindingSource, convertirlo en System.Data.Common.DbDataRecord y luego referirme a su nombre de columna:

  ? ((System.Data.Common.DbDataRecord)_bsBlocks[80])["BlockKey"] 

Ahora eso es simplemente ridículo.

Supongamos que quiere el valor del primer artículo.

 ListBox list = new ListBox(); Console.Write(list.Items[0].Value); 

Esto funciona para mí:

 ListBox x = new ListBox(); x.Items.Add(new ListItem("Hello", "1")); x.Items.Add(new ListItem("Bye", "2")); Console.Write(x.Items[0].Value); 

simplemente pruebe esta listBox es su lista y yu es veriable a la cual se le asignará el valor en el índice 0

 string yu = listBox1.Items[0].ToString(); MessageBox.Show(yu);