Получить значение для элемента списка по индексу

Это должно быть очень легко, но я застрял. У меня есть listBox с элементами X. Каждый элемент имеет текстовое описание (которое появляется в спискеBox) и его значение (числовое). Я хочу иметь возможность получить значение свойства элемента, используя индексный номер элемента.

Ответ 1

Это будет

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

Ответ 2

Здесь я не вижу ни одного правильного ответа на этот вопрос (в теге WinForms), и это странно для такого частого вопроса.

Элементами управления ListBox могут быть DataRowView, сложные объекты, анонимные типы, первичные типы и другие типы. Базовая стоимость предмета должна быть рассчитана на основе ValueMember.

Элемент управления ListBox имеет GetItemText, который помогает вам получить текст элемента независимо от типа объекта, который вы добавили в качестве элемента. Это действительно нуждается в таком методе GetItemValue.

Метод расширения GetItemValue

Мы можем создать GetItemValue метод расширения, чтобы получить значение элемента, которое работает как 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 does not contain '{0}' property or column.",
                list.ValueMember));
        return property.GetValue(item);
    }
}

Используя вышеуказанный метод, вам не нужно беспокоиться о настройках ListBox, и он вернет ожидаемый Value для элемента. Он работает с List<T>, Array, ArrayList, DataTable, списком анонимных типов, списком основных типов и всеми другими списками, которые вы можете использовать в качестве источника данных. Вот пример использования:

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

Поскольку мы создали метод GetItemValue в качестве метода расширения, когда вы хотите использовать метод, не забудьте включить пространство имен, в которое вы помещаете класс.

Этот метод применим также к ComboBox и CheckedListBox.

Ответ 3

Если вы работаете над проектом Windows Forms, вы можете попробовать следующее:

Добавить элементы в объекты ListBox как KeyValuePair:

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

Затем вы сможете получить их следующим образом:

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

Ответ 4

Я использую BindingSource с SqlDataReader за ним, и ни одно из вышеперечисленных не работает для меня.

Вопрос для Microsoft: зачем это работает:

  ? lst.SelectedValue

Но это не так?

   ? lst.Items[80].Value

Я считаю, что мне нужно вернуться к объекту BindingSource, бросить его как System.Data.Common.DbDataRecord, а затем ссылаться на его имя столбца:

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

Теперь это просто смешно.

Ответ 5

Предположим, что вы хотите получить значение первого элемента.

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

Ответ 6

Это работает для меня:

ListBox x = new ListBox();
x.Items.Add(new ListItem("Hello", "1"));
x.Items.Add(new ListItem("Bye", "2"));

Console.Write(x.Items[0].Value);

Ответ 7

просто попробуйте этот 'listBox', это ваш список, а 'yu' является проверяемым, которому будет присвоено значение индекса 0

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