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