31

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

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

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

時間を共有していただきありがとうございます。

4

9 に答える 9

38

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

foreach(object itemChecked in checkedListBox1.CheckedItems)
{
     DataRowView castedItem = itemChecked as DataRowView;
     string comapnyName = castedItem["CompanyName"];
     int? id = castedItem["ID"];
}
于 2011-02-02T14:40:28.793 に答える
14

編集: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方法を使用する必要があります。

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

または、extensionメソッドを使用してOfType、ループ内で明示的にキャストせずに、強く型付けされた結果を取得することもできます。

foreach (var item in checkedListBox1.CheckedItems.OfType<Company>())
{
    MessageBox.Show(item.Id + ": " + item.CompanyName);
}
于 2011-02-02T14:44:16.180 に答える
10

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

于 2011-02-02T14:31:57.237 に答える
1
foreach (int x in chklstTerms.CheckedIndices)
{
    chklstTerms.SelectedIndex=x;
    termids.Add(chklstTerms.SelectedValue.ToString());
}
于 2012-03-16T07:08:01.793 に答える
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());

    }

}
于 2018-02-12T11:13:08.340 に答える
0

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

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

于 2011-09-19T13:50:03.220 に答える
0

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


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

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

のデータソースはCheckedListBoxDataTableまたはのようなオブジェクトを含むリストである可能性があります。したがって、コントロールList<T>の項目は、複雑なオブジェクト、匿名タイプ、プライマリタイプ、およびその他のタイプである可能性があります。CheckedListBoxDataRowView

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できます。

于 2019-05-16T17:55:09.077 に答える
-1

試す:

  foreach (var item in chlCompanies.CheckedItems){
     item.Value //ID
     item.Text //CompanyName
  }
于 2015-08-20T19:01:36.573 に答える
-2

あなたはこれを試すことができます:

string s = "";

foreach(DataRowView drv in checkedListBox1.CheckedItems)
{
    s += drv[0].ToString()+",";
}
s=s.TrimEnd(',');
于 2011-04-06T14:37:52.617 に答える