我想在我的 ListView 中同时维护 ID 和对象类型。我正在尝试这样做:
lstView.Items.Insert(MyObject);
// can't do this, because it takes only Int and String
就我而言,ID 是 int,所以这部分没问题。但是如何插入一个对象类型并在 Item_Selection 更改事件中检索它呢?
AListView
不能像ListBox
or那样直接添加或插入对象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
像很多控件那样的属性,因此如果您希望进行数据绑定,则需要实现一些更自定义的东西。
创建新的 listviewitem 对象。使用标签属性。
解决此问题的最快方法是将对象列表放在一边:
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))
);
将列表视图绑定或代码隐藏附加到字典,然后使用所选项目从您的私人列表中检索您的对象。