C#のWinFormでCheckedListBoxを使用しました。以下に示すように、このコントロールをバインドしました-
chlCompanies.DataSource = dsCompanies.Tables[0];
chlCompanies.DisplayMember = "CompanyName";
chlCompanies.ValueMember = "ID";
チェック済みアイテムのインデックスを取得できますが、チェック済みアイテムのテキストと値を取得するにはどうすればよいですか。むしろ、テキストと値にアクセスするCheckedItemsを列挙するにはどうすればよいですか?
あなたの時間を共有してくれてありがとう。
テーブルをバインドする場合はDataRowViewになる元のタイプにキャストし、適切な列からIdとTextを取得できます。
foreach(object itemChecked in checkedListBox1.CheckedItems)
{
DataRowView castedItem = itemChecked as DataRowView;
string comapnyName = castedItem["CompanyName"];
int? id = castedItem["ID"];
}
編集:それがDataTableにバインドされていることに少し遅れて気付きました。その場合、考え方は同じであり、DataRowView
にキャストし、そのクラスで作業する場合は、Row
プロパティを使用してDataRow
を取得できます。
foreach (var item in checkedListBox1.CheckedItems)
{
var row = (item as DataRowView).Row;
MessageBox.Show(row["ID"] + ": " + row["CompanyName"]);
}
強く型付けされた同等のものにアイテムをキャストまたは解析するか、System.Data.DataSetExtensions
名前空間で使用する DataRowExtensions.Field
method 以下に示します:
foreach (var item in checkedListBox1.CheckedItems)
{
var row = (item as DataRowView).Row;
int id = row.Field<int>("ID");
string name = row.Field<string>("CompanyName");
MessageBox.Show(id + ": " + name);
}
クラスのプロパティにアクセスするには、アイテムをキャストする必要があります。
foreach (var item in checkedListBox1.CheckedItems)
{
var company = (Company)item;
MessageBox.Show(company.Id + ": " + company.CompanyName);
}
または、 OfType
拡張メソッドを使用して、ループ内で明示的にキャストせずに、厳密に型指定された結果を取得できます。
foreach (var item in checkedListBox1.CheckedItems.OfType<Company>())
{
MessageBox.Show(item.Id + ": " + item.CompanyName);
}
CheckedItems
プロパティを反復処理できます。
foreach(object itemChecked in checkedListBox1.CheckedItems)
{
MyCompanyClass company = (MyCompanyClass)itemChecked;
MessageBox.Show("ID: \"" + company.ID.ToString());
}
http://msdn.Microsoft.com/en-us/library/system.windows.forms.checkedlistbox.checkeditems.aspx
foreach (int x in chklstTerms.CheckedIndices)
{
chklstTerms.SelectedIndex=x;
termids.Add(chklstTerms.SelectedValue.ToString());
}
CheckedListBoxで選択されたすべての項目を取得するには、これを試してください。
この場合、この値は文字列ですが、他のタイプのオブジェクトで実行されます:
for (int i = 0; i < myCheckedListBox.Items.Count; i++)
{
if (myCheckedListBox.GetItemChecked(i) == true)
{
MessageBox.Show("This is the value of ceckhed Item " + myCheckedListBox.Items[i].ToString());
}
}
この投稿には既に
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
にも適用できます。
エジプト開発ブログ:vb.netのCheckedListBoxでチェック済みアイテムの値を取得
CheckedListBoxをデータにバインドした後、チェックされた項目の値を取得できます
For i As Integer = 0 To CheckedListBox1.CheckedItems.Count - 1
Dim XDRV As DataRowView = CType(CheckedListBox1.CheckedItems(i), DataRowView)
Dim XDR As DataRow = XDRV.Row
Dim XDisplayMember As String = XDR(CheckedListBox1.DisplayMember).ToString()
Dim XValueMember As String = XDR(CheckedListBox1.ValueMember).ToString()
MsgBox("DisplayMember : " & XDisplayMember & " - ValueMember : " & XValueMember )
Next
ループ内の2変数XDisplayMemberおよびXValueMemberからCheckedListBoxの値またはチェック済みアイテムの表示を使用できるようになりました
役に立つことを願っています。