代码之家  ›  专栏  ›  技术社区  ›  jjnguy Julien Chastang

如何获取列表框中项目的索引?

  •  3
  • jjnguy Julien Chastang  · 技术社区  · 16 年前

    我正在向a添加项目 ListBox 像这样:

    myListBox.Items.addRange(myObjectArray);
    

    我还想通过以下方式选择我添加的一些项目:

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

    然而 index 总是 -1 .

    是否有不同的方法来获取对象的索引 列表框 ?

    3 回复  |  直到 16 年前
        1
  •  8
  •   Neil Barnwell    16 年前

    你应该确保 MyObject 凌驾 Equals() , GetHashCode() ToString() 因此 IndexOf() 方法可以正确地找到对象。

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

        2
  •  7
  •   Kon    16 年前

    您可以对列表框中的值使用某种键,如GUID。然后,您可以轻松使用 myListBox.Items.FindByValue(value) 找到合适的物品。

        3
  •  0
  •   user1228 user1228    16 年前

    IndexOf会检查引用,因此如果otherListOfMyObjects中的项引用的内存对象与myListView中的对象不完全相同。项目,则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定义相等性时确定相等性。你可以按照Fallen的建议添加一个ID,或者按照Neil的建议重写一堆方法(两者都是+s),或者只确定要检查MyObject的哪些属性,以便将它们识别为完全相同的对象。