Comment puis-je obtenir l'index d'un élément dans un contrôle ListBox?
Question
J'ajoute des éléments à un ListBox
comme suit:
myListBox.Items.addRange(myObjectArray);
et je souhaite également sélectionner certains des éléments que j'ajoute comme suit:
foreach(MyObject m in otherListOfMyObjects)
{
int index = myListBox.Items.IndexOf(m);
myListBox.SelectedIndices.Add(index);
}
Cependant, index
est toujours -1
.
Existe-t-il un moyen différent d'obtenir l'index d'un objet dans un ListBox
?
La solution
Assurez-vous que MyObject
remplace Equals ()
, GetHashCode ()
et ToString ()
afin que la méthode IndexOf ()
puisse trouver l'objet correctement.
Techniquement, ToString ()
n'a pas besoin d'être remplacé pour les tests d'égalité, mais il est utile pour le débogage.
Autres conseils
Vous pouvez utiliser une sorte de clé pour les valeurs de la zone de liste, comme les GUID. Ensuite, vous pouvez facilement utiliser myListBox.Items.FindByValue (valeur)
pour trouver le bon élément.
IndexOf vérifie la référence. Par conséquent, si les éléments de otherListOfMyObjects ne référencent pas les mêmes objets en mémoire que myListBox.Items, IndexOf ne fonctionnera pas.
Vous pouvez utiliser linq. Voici un pseudocode qui ressemble à C #, qui peut compiler et qui peut fonctionner:
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);
Évidemment, cela ne fonctionnera pas car y == x retournera toujours faux (c'est pourquoi votre méthode actuelle ne fonctionnera pas). Vous devez substituer y == x pour effectuer une comparaison d'égalité qui déterminera l'égalité à mesure que VOUS la définissez pour MyObject. Vous pouvez le faire en ajoutant un identifiant comme suggéré par Fallen ou en remplaçant un tas de méthodes comme suggéré par Neil (+ s pour les deux), ou en déterminant simplement les propriétés de MyObject à vérifier pour les identifier comme étant exactement le même objet. .