Получить значение элемента списка по индексу - PullRequest
13 голосов
/ 28 июня 2011

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

Ответы [ 7 ]

12 голосов
/ 22 мая 2014

Это будет

String MyStr = ListBox.items[5].ToString();
9 голосов
/ 11 июля 2016

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

5 голосов
/ 28 июня 2011

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

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

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

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

KeyValuePair keyValuePair = listBox.Items[index];
var value = keyValuePair.Value;
4 голосов
/ 02 сентября 2011

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

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

  ? lst.SelectedValue

Но это не't?

   ? lst.Items[80].Value

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

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

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

2 голосов
/ 28 июня 2011

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

ListBox list = new ListBox();
Console.Write(list.Items[0].Value);
1 голос
/ 14 мая 2017

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

string yu = listBox1.Items[0].ToString();
MessageBox.Show(yu);
1 голос
/ 28 июня 2011

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

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

Console.Write(x.Items[0].Value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...