Comment puis-je obtenir l'index d'un élément dans un contrôle ListBox?

StackOverflow https://stackoverflow.com/questions/408320

  •  03-07-2019
  •  | 
  •  

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 ?

Était-ce utile?

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. .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top