Domanda

Sto aggiungendo elementi a un ListBox in questo modo:

myListBox.Items.addRange(myObjectArray);

e voglio anche selezionare alcuni degli elementi che aggiungo come segue:

foreach(MyObject m in otherListOfMyObjects) 
{
    int index = myListBox.Items.IndexOf(m);
    myListBox.SelectedIndices.Add(index);
}

tuttavia indice è sempre -1 .

Esiste un modo diverso per ottenere l'indice di un oggetto in un ListBox ?

È stato utile?

Soluzione

Dovresti assicurarti che MyObject sovrascriva Equals () , GetHashCode () e ToString () così che il metodo IndexOf () può trovare l'oggetto correttamente.

Tecnicamente, ToString () non ha bisogno di essere sovrascritto per i test di uguaglianza, ma è utile per il debug.

Altri suggerimenti

È possibile utilizzare una sorta di chiave per i valori nella casella di riepilogo, come i GUID. Quindi puoi facilmente usare myListBox.Items.FindByValue (valore) per trovare l'elemento giusto.

IndexOf controlla il riferimento, quindi se gli elementi in otherListOfMyObjects non fanno riferimento agli stessi oggetti esatti in memoria di myListBox.Items, IndexOf non funzionerà.

Quello che potresti fare è usare linq. Ecco alcuni pseudocodici che assomigliano a C #, possono essere compilati e potrebbero effettivamente funzionare:

var items =  from x in myListBox.Items where otherListOfMyObjects.Any(y => y == x /*SEE NOTE*/) select x;
foreach(item i in items)
  myListBox.SelectedItems.Add(i);

Ovviamente, ciò non funzionerà poiché y == x restituirà sempre false (ecco perché il tuo metodo attuale non funzionerà). È necessario sostituire y == x per eseguire un confronto di uguaglianza che determinerà l'uguaglianza mentre la definisci per MyObject. Puoi farlo aggiungendo un ID come Fallen ha suggerito o sovrascrivendo un buttload di metodi come Neil ha suggerito (+ s per entrambi), o semplicemente determinando quali proprietà di MyObject controllare per identificarli esattamente come lo stesso oggetto .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top