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

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

7 ответов

Это было бы

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

Здесь я не вижу ни одного правильного ответа на этот вопрос (в теге 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 doesn't 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 тоже.

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

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

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

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

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

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

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

  ? lst.SelectedValue

Но это не так?

   ? lst.Items[80].Value

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

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

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

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

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

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

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

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

Просто попробуйте этот listBox - это ваш список, и вы можете проверить, какое значение будет присвоено индексу 0

string yu = listBox1.Items[0].ToString();
MessageBox.Show(yu);
Другие вопросы по тегам