ListView.ItemCollection.Contains()如何工作?

时间:2010-03-25 10:41:10

标签: .net winforms listview listviewitem

我正在将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())能够识别它们吗?

1 个答案:

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