web-dev-qa-db-ja.com

インデックスでリストボックスアイテムの値を取得する

これは非常に簡単でなければなりませんが、私は立ち往生しています。 Xアイテムのリストボックスがあります。各アイテムには、テキストの説明(listBoxに表示される)とその値(数値)があります。アイテムのインデックス番号を使用して、アイテムのvalueプロパティを取得できるようにします。

13
tzam

それはそのようになります

String MyStr = ListBox.items[5].ToString();
12
user3666179

ここでは、この質問(WinFormsタグ内)に対する正しい答えが1つも表示されず、このような頻繁な質問に対しては奇妙です。

ListBoxコントロールのアイテムには、DataRowView、複合オブジェクト、匿名型、プライマリ型、その他の型があります。アイテムの基礎となる値は、ValueMemberに基づいて計算する必要があります。

ListBoxコントロールにはGetItemTextがあり、アイテムとして追加したオブジェクトのタイプに関係なく、アイテムテキストを取得できます。本当にそのようなGetItemValueメソッドが必要です。

GetItemValue拡張メソッド

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.listBox1.GetItemValue(this.listBox1.Items[2]);

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

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

9
Reza Aghaei

Windowsフォームプロジェクトで作業している場合は、次を試すことができます。

ListBoxオブジェクトにKeyValuePairオブジェクトとしてアイテムを追加します。

listBox.Items.Add(new KeyValuePair(key, value);

その後、次の方法でそれらを取得できます。

KeyValuePair keyValuePair = listBox.Items[index];
var value = keyValuePair.Value;
5
Akram Shahda

私はBindingSourceをその背後にあるSqlDataReaderとともに使用していますが、上記のいずれも機能しません。

マイクロソフトへの質問:なぜこれが機能するのか:

  ? lst.SelectedValue

しかし、これは違いますか?

   ? lst.Items[80].Value

BindingSourceオブジェクトに戻ってSystem.Data.Common.DbDataRecordとしてキャストし、その列名を参照する必要があります。

   ? ((System.Data.Common.DbDataRecord)_bsBlocks[80])["BlockKey"]

今それはばかげている。

4
Mike K

最初のアイテムの値が必要だとします。

ListBox list = new ListBox();
Console.Write(list.Items[0].Value);
2
Bibhu

単にこの「listBox」を試してみてください。「yu」はインデックス0の値が割り当てられる変数です。

string yu = listBox1.Items[0].ToString();
MessageBox.Show(yu);
1
Jair Martinez

これは私のために働く:

ListBox x = new ListBox();
x.Items.Add(new ListItem("Hello", "1"));
x.Items.Add(new ListItem("Bye", "2"));

Console.Write(x.Items[0].Value);
1
DaveShaw