12

我想在我的 ListView 中同时维护 ID 和对象类型。我正在尝试这样做:

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

就我而言,ID 是 int,所以这部分没问题。但是如何插入一个对象类型并在 Item_Selection 更改事件中检索它呢?

4

3 回答 3

31

AListView不能像ListBoxor那样直接添加或插入对象ComboBox,而是需要创建 aListViewItem并设置其Tag属性。

Msdn 的 Tag 属性

包含有关控件的数据的对象。默认值为空。

从 Object 类派生的任何类型都可以分配给此属性。如果通过 Windows 窗体设计器设置 Tag 属性,则只能分配文本。Tag 属性的一个常见用途是存储与控件密切相关的数据。例如,如果您有一个显示客户信息的控件,您可以在该控件的 Tag 属性中存储一个包含客户订单历史记录的 DataSet,以便可以快速访问数据。

示例代码:

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

AListView不支持DataSource像很多控件那样的属性,因此如果您希望进行数据绑定,则需要实现一些更自定义的东西。

于 2012-05-07T05:25:00.140 回答
2

创建新的 listviewitem 对象。使用标签属性。

于 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 回答