我正在将ListViewItems从一个ListView复制到另一个ListView,某事。像:
foreach (ListViewItem item in usersListView.SelectedItems) {
selectedUsersListView.Items.Add((ListViewItem)item.Clone());
}
如果我想使用ListView.ItemCollection.Contains()来确定某个项目是否已被复制,我总是会得到错误:
foreach (ListViewItem item in usersListView.SelectedItems) {
if (!selectedUsersListView.Items.Contains(item) { // always !false
selectedUsersListView.Items.Add((ListViewItem)item.Clone());
}
}
我做了以下事情来解决我的问题:
foreach (ListViewItem item in usersListView.SelectedItems) {
ListViewItem newItem = (ListViewItem)item.Clone();
newItem.Name = newItem.Text;
if (!selectedUsersListView.Items.ContainsKey(newItem.Name) { // this works
selectedUsersListView.Items.Add(newItem);
}
}
所以,这可以解决我的问题,但我仍然不知道为什么ListView.ItemCollection.Contains()不起作用......
ListView.ItemCollection.Contains()如何识别项目是否已存在?
ListViewItems如何初始化ListView.ItemCollection。包含()(不是 ListView.ItemCollection.ContainsKey())能够识别它们吗?
答案 0 :(得分:3)
内部ListViewItemCollection使用==运算符来测试相等性。由于ListViewItem不会覆盖==运算符,因此ListViewItemCollection.Contains会比较引用。由于您正在克隆ListViewItems,因此您对Contains的调用将始终返回false,因为您正在比较两个不同的对象引用。
您无法将相同的ListViewItem添加到两个不同的ListView中,因此使用Contains无法实现您的尝试。您需要使用ContainsKey。在以下示例中,Contains将返回true:
var item = new ListViewItemEquality("Item1");
listView1.Items.Add(item1);
Debug.Assert(listView1.Items.Contains(item1));