如何在ListView中插入对象类型?

use*_*285 10 c# winforms

我想在ListView中维护ID和Object Type.我正在尝试这样做:

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

在我的情况下,ID是int,所以该部分是好的.但是如何在Item_Selection更改事件中插入对象类型并检索它?

Dav*_*son 28

A ListView不能像ListBox或者那样直接添加或插入对象ComboBox,而是需要创建ListViewItem并设置其Tag属性.

来自Msdn的Tag属性

包含有关控件的数据的Object.默认值为null.

可以将从Object类派生的任何类型分配给此属性.如果通过Windows窗体设计器设置Tag属性,则只能分配文本.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);
Run Code Online (Sandbox Code Playgroud)

当您需要从中取回物体时ListView,您可以施放该Tag物品.

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

    // Can access other MyObject Members
}
Run Code Online (Sandbox Code Playgroud)

通常,它更容易将功能包装到辅助方法中.

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

    // Other requirements as needed

    listView.Items.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

CreateListViewItem(listView, obj);
Run Code Online (Sandbox Code Playgroud)

A ListView不支持DataSource像很多控件这样的属性,所以如果你想要数据绑定,你需要实现一些更自定义的东西.