Как я могу получить индекс элемента в ListBox? - PullRequest
3 голосов
/ 03 января 2009

Я добавляю элементы к ListBox примерно так:

myListBox.Items.addRange(myObjectArray);

и я также хочу выбрать некоторые из элементов, которые я добавляю, следующим образом:

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

однако index всегда -1.

Есть ли другой способ получить индекс объекта в ListBox?

Ответы [ 3 ]

8 голосов
/ 03 января 2009

Вы должны убедиться, что MyObject переопределяет Equals(), GetHashCode() и ToString(), чтобы метод IndexOf() мог правильно найти объект.

Технически, ToString() не нужно переопределять для проверки на равенство, но это полезно для отладки.

7 голосов
/ 03 января 2009

Вы можете использовать какой-то ключ для значений в списке, например, GUID. Тогда вы можете легко использовать myListBox.Items.FindByValue(value), чтобы найти нужный предмет.

0 голосов
/ 03 января 2009

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. Вы можете сделать это, добавив идентификатор, как предложил Fallen, или переопределив набор методов, как предложил Neil (+ s для них обоих), или просто определив, какие свойства MyObject следует проверять, чтобы идентифицировать их как точно один и тот же объект. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...