2012-02-28 83 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());