ListViewでIDとオブジェクトタイプの両方を維持したい。私はこれをやろうとしています:
lstView.Items.Insert(MyObject);
// can't do this, because it takes only Int and String
私の場合、IDはintなので、その部分は問題ありません。しかし、オブジェクトタイプを挿入し、Item_Selectionchangedイベントでそれを取得するにはどうすればよいですか?
は、またはListView
のようにオブジェクトを直接追加または挿入することはできませんが、代わりに、を作成してそのプロパティを設定する必要があります。ListBox
ComboBox
ListViewItem
Tag
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
データバインドが必要な場合は、もう少しカスタムなものを実装する必要があります。
新しいlistviewitemオブジェクトを作成します。Tagプロパティを使用します。
これを回避する最も簡単な方法は、オブジェクトのリストを横に保持することです。
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))
);
リストビューをディクショナリにバインドまたはコードビハインドしてから、選択したアイテムを使用してプライベートリストからオブジェクトを取得します。