この投稿にはすでに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
できます。