web-dev-qa-db-ja.com

CheckedListBoxからチェック項目の値を取得する方法は?

C#のWinFormでCheckedListBoxを使用しました。以下に示すように、このコントロールをバインドしました-

chlCompanies.DataSource = dsCompanies.Tables[0];
chlCompanies.DisplayMember = "CompanyName";
chlCompanies.ValueMember = "ID";

チェック済みアイテムのインデックスを取得できますが、チェック済みアイテムのテキストと値を取得するにはどうすればよいですか。むしろ、テキストと値にアクセスするCheckedItemsを列挙するにはどうすればよいですか?

あなたの時間を共有してくれてありがとう。

26
IrfanRaza

テーブルをバインドする場合はDataRowViewになる元のタイプにキャストし、適切な列からIdとTextを取得できます。

foreach(object itemChecked in checkedListBox1.CheckedItems)
{
     DataRowView castedItem = itemChecked as DataRowView;
     string comapnyName = castedItem["CompanyName"];
     int? id = castedItem["ID"];
}
29
Iain Ward

編集:それが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);
}
14
Ahmad Mageed

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

9
Evan Mulawski
foreach (int x in chklstTerms.CheckedIndices)
{
    chklstTerms.SelectedIndex=x;
    termids.Add(chklstTerms.SelectedValue.ToString());
}
1

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());

    }

}
1
daniele3004

この投稿には既にGetItemValue拡張メソッドを投稿しました インデックスでリストボックスアイテムの値を取得 。この拡張メソッドは、ListControlCheckedListBox、およびListBoxを含むすべてのComboBoxクラスに対して機能します。


既存の答えはどれも十分に一般的ではありませんが、問題に対する一般的な解決策があります。

すべての場合において、データソースのタイプに関係なく、アイテムの基礎となるValueValueMemberに関して計算される必要があります。

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>ArrayArrayListDataTable、匿名タイプのリスト、プライマリタイプのリスト、およびデータソースとして使用できる他のすべてのリストで動作します。以下に使用例を示します。

//Gets underlying value at index 2 based on settings
this.checkedListBox.GetItemValue(this.checkedListBox.Items[2]);

拡張メソッドとしてGetItemValueメソッドを作成したため、メソッドを使用する場合は、クラスを配置する名前空間を含めることを忘れないでください。

このメソッドは、ComboBoxおよびCheckedListBoxにも適用できます。

0
Reza Aghaei

エジプト開発ブログ: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の値またはチェック済みアイテムの表示を使用できるようになりました

役に立つことを願っています。

0
Kareem Allam