我已使用以下内容将一些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);
我这样做的方法不对吗?!
答案 0 :(得分:3)
为了在组合框中“找到”新的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;
}
答案 1 :(得分:0)
我这样做的方法不对吗?!
没有。默认情况下,IndexOf将检查项目列表中是否存在相同的引用。由于它是您刚刚实例化的新StaffRole,因此它不存在于列表中。
我认为您要做的是按ID进行比较。为此,您可以覆盖Equals
类中的GetHashCode
和StaffRole
。在自定义Equals
方法中,您将按角色ID比较两个对象。执行此操作后,IndexOf
将按预期工作,方法是使用ID而不是引用进行比较。
答案 2 :(得分:0)
也许你可以使用
两个方法都将返回列表中元素的索引,该索引与方法接收的字符串参数的值相匹配。
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());