Domanda

Sto copiando ListViewItems da un ListView a un altro, qc. come:

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

Se voglio usare ListView.ItemCollection.Contains () per determinare se un elemento è stato già copiato ottengo sempre false:

foreach (ListViewItem item in usersListView.SelectedItems) {
    if (!selectedUsersListView.Items.Contains(item) { // always !false
        selectedUsersListView.Items.Add((ListViewItem)item.Clone());
    }
}

Ho fatto quanto segue per risolvere il mio problema:

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

Quindi, va bene che questo risolve il mio problema ma ho ancora idea del perché ListView.ItemCollection.Contains () non funziona ...

Come funziona ListView.ItemCollection.Contains () individuare se un elemento esiste già?

Come fare ListViewItems devono essere inizializzato che ListView.ItemCollection. Contiene () ( non ListView.ItemCollection.ContainsKey ()) è in grado di identificarli?

È stato utile?

Soluzione

Internamente ListViewItemCollection usa l'operatore == per verificare l'uguaglianza. Dal momento che ListViewItem non sostituisce l'operatore ==, ListViewItemCollection.Contains confronta i riferimenti. Dal momento che si sta clonando i tuoi ListViewItems, la chiamata al Contiene restituisce sempre falso perché si confrontano due diversi riferimenti a oggetti.

Modifica:

Non è possibile aggiungere lo stesso ListViewItem a due ListViews differenti in modo da ciò che si sta cercando di fare non è possibile utilizzare Contiene. È necessario utilizzare ContainsKey. Nel seguente esempio contiene restituirà true:

var item = new ListViewItemEquality("Item1");
listView1.Items.Add(item1);
Debug.Assert(listView1.Items.Contains(item1));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top