Это должно быть очень легко, но я застрял. У меня есть 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);