12

ListViewでIDとオブジェクトタイプの両方を維持したい。私はこれをやろうとしています:

lstView.Items.Insert(MyObject);
// can't do this, because it takes only Int and String

私の場合、IDはintなので、その部分は問題ありません。しかし、オブジェクトタイプを挿入し、Item_Selectionchangedイベントでそれを取得するにはどうすればよいですか?

4

3 に答える 3

31

は、またはListViewのようにオブジェクトを直接追加または挿入することはできませんが、代わりに、を作成してそのプロパティを設定する必要があります。ListBoxComboBoxListViewItemTag

MsdnのTagプロパティ

コントロールに関するデータを含むオブジェクト。デフォルトはnullです。

Objectクラスから派生した任意の型を、このプロパティに割り当てることができます。TagプロパティがWindowsフォームデザイナで設定されている場合、テキストのみを割り当てることができます。Tagプロパティの一般的な使用法は、コントロールに密接に関連付けられているデータを格納することです。たとえば、顧客に関する情報を表示するコントロールがある場合、データにすばやくアクセスできるように、顧客の注文履歴を含むDataSetをそのコントロールのTagプロパティに保存できます。

コード例:

MyObject myObj = new MyObject();

ListViewItem item = new ListViewItem();
item.Text = myObj.ToString(); // Or whatever display text you need
item.Tag = myObj;

// Setup other things like SubItems, Font, ...

listView.Items.Add(item);

からオブジェクトを取り戻す必要がある場合ListViewは、プロパティをキャストできTagます。

private void OnListViewItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
    MyObject myObj = (MyObject)e.Item.Tag;
    int id = myObj.Id;

    // Can access other MyObject Members
}

通常、機能をヘルパーメソッドにラップする方が簡単です。

public static void CreateListViewItem(ListView listView, MyObject obj) {
    ListViewItem item = new ListViewItem();
    item.Tag = obj;

    // Other requirements as needed

    listView.Items.Add(item);
}

そして、あなたはできる:

CreateListViewItem(listView, obj);

Aは多くのコントロールのようなプロパティListViewをサポートしていないため、DataSourceデータバインドが必要な場合は、もう少しカスタムなものを実装する必要があります。

于 2012-05-07T05:25:00.140 に答える
2

新しいlistviewitemオブジェクトを作成します。Tagプロパティを使用します。

于 2012-05-07T05:27:22.853 に答える
1

これを回避する最も簡単な方法は、オブジェクトのリストを横に保持することです。

List<MyObject> list = ... ; // my list

IDとして文字列を使用してリストから辞書を生成するか、インデックスを使用して元のリストから取得できます。

Dictionary<int,string> listBinder = new Dictionary<int,string>(
    list.Select(i => new KeyValuePair<int,string>(i.ID, i.Name))
);

リストビューをディクショナリにバインドまたはコードビハインドしてから、選択したアイテムを使用してプライベートリストからオブジェクトを取得します。

于 2012-05-07T05:17:19.003 に答える