2

ListViewItemsをあるListViewから別のListViewにコピーしています。お気に入り:

foreach (ListViewItem item in usersListView.SelectedItems) {
    selectedUsersListView.Items.Add((ListViewItem)item.Clone());
}

ListView.ItemCollection.Contains()を使用して、アイテムがすでにコピーされているかどうかを判断したい場合、常にfalseになります。

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に初期化するにはどうすればよいですか。contains()(ListView.ItemCollection.ContainsKey()ではない)はそれらを識別できますか?

4

1 に答える 1

3

内部的に、ListViewItemCollection は == 演算子を使用して等しいかどうかをテストします。ListViewItem は == 演算子をオーバーライドしないため、ListViewItemCollection.Contains は参照を比較します。ListViewItems を複製しているため、2 つの異なるオブジェクト参照を比較しているため、Contains への呼び出しは常に false を返します。

編集:

同じ ListViewItem を 2 つの異なる ListViews に追加することはできないため、Contains を使用してやろうとしていることはできません。ContainsKey を使用する必要があります。次の例では、Contains は true を返します。

var item = new ListViewItemEquality("Item1");
listView1.Items.Add(item1);
Debug.Assert(listView1.Items.Contains(item1));
于 2010-03-25T10:58:34.227 に答える