使用IndexOf搜索组合框

时间:2012-02-28 14:20:12

标签: c# visual-studio indexof

我已使用以下内容将一些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 个答案:

答案 0 :(得分:3)

为了在组合框中“找到”新的StaffRole实例,您需要描述为什么两个StaffRole实例应被视为等效。

因此您需要覆盖EqualsGetHashCode。从技术上讲,您只需要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;
    }

答案 1 :(得分:0)

  

我这样做的方法不对吗?!

没有。默认情况下,IndexOf将检查项目列表中是否存在相同的引用。由于它是您刚刚实例化的新StaffRole,因此它不存在于列表中。

我认为您要做的是按ID进行比较。为此,您可以覆盖Equals类中的GetHashCodeStaffRole。在自定义Equals方法中,您将按角色ID比较两个对象。执行此操作后,IndexOf将按预期工作,方法是使用ID而不是引用进行比较。

答案 2 :(得分:0)

也许你可以使用

  • 查找字符串(字符串)
  • FindStringExact(字符串)

两个方法都将返回列表中元素的索引,该索引与方法接收的字符串参数的值相匹配。

Combobox documentation here.

答案 3 :(得分:0)

我不想替换equal / hashcode mehtods,因为我需要它们对于不同的实例是不同的。

所以,我使用了一些Linq来找到集合中的正确元素:

this.comboBox_group.SelectedIndex = 
   this.comboBox_group.Items.IndexOf
   (comboBox_group.Items.Cast<Group>().Where(x => x.Id == SelectedId).First());