如何获取ListBox中的项目索引?

我正在向ListBox添加项目,如下所示:

 myListBox.Items.addRange(myObjectArray); 

我还想选择以下添加的一些项目:

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

index总是-1

是否有不同的方法来获取ListBox中的对象的索引?

您应该确保MyObject重写Equals()GetHashCode()ToString()以便IndexOf()方法可以正确地找到对象。

从技术上讲,不需要重写ToString()进行相等性测试,但它对调试很有用。

您可以在列表框中使用某种键作为值,例如GUID。 然后,您可以轻松使用myListBox.Items.FindByValue(value)来查找正确的项目。

IndexOf检查引用,因此如果otherListOfMyObjects中的项不引用内存中与myListBox.Items相同的确切对象,则IndexOf将不起作用。

你能做的就是使用linq。 这里有一些看起来像C#的伪代码,可以编译并且实际上可以工作:

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

显然,这将不起作用,因为y == x将始终返回false(这就是为什么您当前的方法不起作用)。 您需要替换y == x来执行相等比较,这将确定您为MyObject定义的相等性。 您可以通过添加ID作为Fallen建议或通过覆盖Neil建议的方法(对于它们两者都是+)来实现此目的,或者通过确定MyObject的哪些属性来检查以便将它们标识为完全相同的对象。