Я уже разместил GetItemValue
метод расширения в этом сообщении Получите значение для элемента списка по индексу .Этот метод расширения будет работать для всех классов ListControl
, включая CheckedListBox
, ListBox
и ComboBox
.
Ни один из существующих ответов не является достаточно общим, но существует общее решение проблемы.
Во всех случаях базовый Value
элемента должен быть рассчитан относительно ValueMember
, независимо от типа источника данных.
Источник данных CheckedListBox
можетможет быть DataTable
или это может быть список, содержащий объекты, например List<T>
, поэтому элементы CheckedListBox
могут быть DataRowView
, сложные объекты, анонимные типы, первичные типы и другие типы.
Метод расширения GetItemValue
Нам нужен GetItemValue
, который работает аналогично GetItemText
, но возвращает объект, базовое значение элемента, независимо оттип объекта, который вы добавили как элемент.
Мы можем создать 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.checkedListBox.GetItemValue(this.checkedListBox.Items[2]);
Поскольку мы создали метод GetItemValue
в качестве метода расширения, когда вы хотите использовать метод, не забудьте включить пространство имен, в которое вы помещаетекласс.
Этот метод применим также к ComboBox
и CheckedListBox
.