Использование IndexOf для поиска поля со списком - PullRequest
1 голос
/ 28 февраля 2012

Я вставил несколько StaffRole файлов в комбинированный список, используя приведенные ниже;

for (int i=0; i < staffRoles.Count; i++)
        {
            user_Role_Combo.Items.Add(staffRoles[i]);
        }

Я пытаюсь найти индекс определенного элемента в поле со списком, чтобы он отображал правильный элемент при загрузке, я получил это, но он просто возвращает -1 каждый раз;

StaffRole sr = new StaffRole("",roleID);
int comboBoxID = user_Role_Combo.Items.IndexOf(sr);

Я делаю это правильно, нет?!

Ответы [ 4 ]

3 голосов
/ 28 февраля 2012

Чтобы ваш новый экземпляр StaffRole был «найден» в поле со списком, вам необходимо описать, почему два экземпляра StaffRole следует считать эквивалентными.

Так что вам нужно переопределить Equals и GetHashCode. Технически, вам нужно только Equals, но эти два метода должны быть переопределены вместе.

Один из способов справиться с этим - основать равенство объектов на roleId равенстве, например:

    public override int GetHashCode() {
        return roleId.GetHashCode();
    }

    public override bool Equals(object obj) {
        if (obj == this) return true;
        var other = obj as StaffRole;
        if (other == null) return false;
        return roleId == other.roleId;
    }
0 голосов
/ 28 февраля 2018

Я не хотел заменять методы с одинаковым хеш-кодом, так как они нужны для разных экземпляров.

Итак, я использовал Linq, чтобы найти нужный элемент внутри коллекции:

this.comboBox_group.SelectedIndex = 
   this.comboBox_group.Items.IndexOf
   (comboBox_group.Items.Cast<Group>().Where(x => x.Id == SelectedId).First());
0 голосов
/ 28 февраля 2012

Возможно, вы могли бы использовать либо

  • FindString (String)
  • FindStringExact (String)

Оба метода вернут индекс элемента в списке, который соответствует значению строкового параметра, который получает метод.

Combobox документация здесь.

0 голосов
/ 28 февраля 2012

Я делаю это правильно, нет?!

Нет. По умолчанию IndexOf проверит, существует ли такая же ссылка в списке элементов. Поскольку это только что созданная StaffRole, она не существует в списке.

Я думаю, вы хотите сравнить по ID. Для этого вы можете переопределить Equals и GetHashCode в классе StaffRole. В вашем пользовательском методе Equals вы сравниваете два объекта по идентификатору роли. После этого IndexOf будет работать так, как вы ожидаете, сравнивая использование идентификаторов вместо ссылок.

...