我已经在这篇文章Get the value for a listbox item by indexGetItemValue
中发布了扩展方法
。此扩展方法适用于所有类,包括
,和.ListControl
CheckedListBox
ListBox
ComboBox
现有的答案都不够通用,但是对于这个问题有一个通用的解决方案。
在所有情况下,无论数据源的类型如何,Value
都应根据 来计算项目的基础。ValueMember
的数据源CheckedListBox
可能是a DataTable
,也可能是包含对象的列表,如a 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
。