Frage

Ich bin das Hinzufügen von Elementen zu einem ListBox etwa so:

myListBox.Items.addRange(myObjectArray);

und ich möchte auch einige der Elemente auszuwählen I durch die folgende hinzufügen:

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

jedoch index ist immer -1.

Gibt es eine andere Art und Weise den Index ein Objekt in einem ListBox zu bekommen?

War es hilfreich?

Lösung

Sie sollten sicherstellen, dass MyObject überschreibt Equals(), GetHashCode() und ToString(), so dass die IndexOf() Methode richtig, das Objekt finden.

Technisch ToString() muss nicht für die Gleichstellung Prüfung außer Kraft gesetzt werden, aber es ist nützlich für die Fehlersuche.

Andere Tipps

Sie können eine Art Schlüssel für Werte in der Listbox, wie GUIDs verwenden. Dann können Sie leicht myListBox.Items.FindByValue(value) verwenden, um die richtigen Artikel zu finden.

IndexOf prüft die Referenz, so dass, wenn die Elemente in otherListOfMyObjects verweisen nicht exakt die gleichen Objekte im Speicher als myListBox.Items, dann wird IndexOf nicht funktionieren.

Was könnten Sie tun, ist die Verwendung von Linq. Hier einige Pseudo-Code, der wie C # aussieht, kompilieren und kann tatsächlich funktionieren:

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

Natürlich, die als y == x wird nicht funktionieren wird immer false zurück (das ist, warum Ihre aktuelle Methode wird nicht funktionieren). Sie müssen y == x ersetzen einen Gleichheitsvergleich auszuführen, die Gleichheit bestimmen wird, wie Sie es für MyObject definieren. Sie können dies tun, indem Sie eine ID-Zugabe, wie vorgeschlagen Gefallen oder durch eine buttload von Methoden zwingende als Neil vorgeschlagen (+ s für beide) oder durch nur bestimmen, welche Eigenschaften von MyObject, um zu prüfen sie, wie genau das gleiche Objekt zu identifizieren .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top