I've already posted GetItemValue
extension method in this post
Get the value for a listbox item by
index. This extension
method will work for all ListControl
classes including
CheckedListBox
, ListBox
and ComboBox
.
None of the existing answers are general enough, but there is a general solution for the problem.
In all cases, the underlying Value
of an item should be calculated regarding to ValueMember
, regardless of the type of data source.
The data source of the CheckedListBox
may be a DataTable
or it may be a list which contains objects, like a List<T>
, so the items of a CheckedListBox
control may be DataRowView
, Complex Objects, Anonymous types, primary types and other types.
GetItemValue Extension Method
We need a GetItemValue
which works similar to GetItemText
, but return an object, the underlying value of an item, regardless of the type of object you added as item.
We can create GetItemValue
extension method to get item value which works like 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);
}
}
Using above method you don't need to worry about settings of ListBox
and it will return expected Value
for an item. It works with List<T>
, Array
, ArrayList
, DataTable
, List of Anonymous Types, list of primary types and all other lists which you can use as data source. Here is an example of usage:
//Gets underlying value at index 2 based on settings
this.checkedListBox.GetItemValue(this.checkedListBox.Items[2]);
Since we created the GetItemValue
method as an extension method, when you want to use the method, don't forget to include the namespace in which you put the class.
This method is applicable on ComboBox
and CheckedListBox
too.
Value
of an item should be calculated regarding toValueMember
, regardless of the type of data source. The data source may be aDataTable
or aList
and the type of the item may beDataRowView
orobject
or simple data types. This post shares a general solution. – Xenogenesis