2012-02-28 85 views
1

我已经使用以下方法将几个StaffRole文件插入到组合框中;使用IndexOf搜索组合框

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

取决于这是否是WPF或WinForms的 – 2012-02-28 14:22:39

+0

请出示你的'StaffRole.Equals'方法。 – dasblinkenlight 2012-02-28 14:23:30

+0

'user_Role_Combo'的类型是什么? – Shai 2012-02-28 14:23:45

回答

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

真棒,感谢和其他人! – r0bb077 2012-02-28 15:10:18

0

我正在做这个正确的方式不?

编号默认情况下,IndexOf将检查项目列表中是否存在相同的参考。由于它是一个刚刚实例化的新的StaffRole,它不在列表中。

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

0

也许你可以使用任何

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

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

组合框documentation here.

0

我不想更换等于/哈希码mehtods,因为我需要他们对不同情况下的不同。

所以,我用了一些LINQ到找到集合内适当的元素:

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