使用IndexOf搜索组合框

问题描述 投票:1回答:4

我使用下面的方法将一些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);

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

c# visual-studio indexof
4个回答
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;
    }

0
投票

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

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

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


0
投票

也许你可以使用其中之一

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

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

Combobox documentation here.


0
投票

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

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

this.comboBox_group.SelectedIndex = 
   this.comboBox_group.Items.IndexOf
   (comboBox_group.Items.Cast<Group>().Where(x => x.Id == SelectedId).First());
© www.soinside.com 2019 - 2024. All rights reserved.