2012-02-28 5 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

이 당신의'StaffRole.Equals' 방법을 제시해주십시오 WPF 또는 윈폼 –

+0

여부에 따라 달라집니다 :

그래서, 컬렉션 내부의 적절한 요소를 찾기 위해 몇 가지 Linq를 사용했다. – dasblinkenlight

+0

'user_Role_Combo'의 유형은 무엇입니까? – Shai

답변

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

0

나는 올바른 방법을 사용하고 있지 않습니까?!

아니요 기본적으로 IndexOf는 항목 목록에 동일한 참조가 있는지 확인합니다. 방금 설치 한 새로운 직원 역할이기 때문에 목록에 존재하지 않습니다.

ID로 비교하고 싶다고 생각합니다. 이렇게하려면 StaffRole 클래스에서 EqualsGetHashCode을 재정의 할 수 있습니다. 사용자 지정 Equals 방법에서는 역할 ID별로 두 개체를 비교합니다. 이 작업을 수행 한 후 IndexOf은 참조 대신 ID를 사용하여 비교하여 예상대로 작동합니다.

0

아마 당신도

  • FINDSTRING (문자열)
  • FindStringExact을 사용할 수 있습니다 (문자열)

두 방법 모두 색인을 반환합니다. f 메서드에서받는 문자열 매개 변수의 값과 일치하는 목록의 요소

콤보 documentation here.

0

내가 다른 인스턴스에 대해 서로 다른 수를 필요로하는 I가 동일/해시 코드 mehtods을 대체 싶지 않았다.

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