문제

나는 a에 항목을 추가하고있다 ListBox 그렇게 :

myListBox.Items.addRange(myObjectArray);

또한 다음과 같은 일부 항목을 선택하고 싶습니다.

foreach(MyObject m in otherListOfMyObjects) 
{
    int index = myListBox.Items.IndexOf(m);
    myListBox.SelectedIndices.Add(index);
}

하지만 index 항상 -1.

객체의 색인을 ListBox?

도움이 되었습니까?

해결책

당신은 그것을 확인해야합니다 MyObject 재정의 Equals(), GetHashCode() 그리고 ToString() 그래서 IndexOf() 방법은 객체를 올바르게 찾을 수 있습니다.

기술적으로 ToString() 평등 테스트를 위해 재정의 할 필요는 없지만 디버깅에 유용합니다.

다른 팁

Guids와 같은 ListBox의 값에 대한 KEY를 사용할 수 있습니다. 그런 다음 쉽게 사용할 수 있습니다 myListBox.Items.FindByValue(value) 올바른 항목을 찾으려면.

indexof는 참조를 점검하므로 다른 목록의 항목이 mylistbox.Items와 메모리에서 동일한 정확한 객체를 참조하지 않으면 INDEXOF가 작동하지 않습니다.

당신이 할 수있는 일은 LINQ를 사용하는 것입니다. 다음은 C#처럼 보이고 컴파일 할 수 있으며 실제로 작동 할 수있는 일부 의사 코드입니다.

var items =  from x in myListBox.Items where otherListOfMyObjects.Any(y => y == x /*SEE NOTE*/) select x;
foreach(item i in items)
  myListBox.SelectedItems.Add(i);

분명히, 그것은 y == x가 항상 false를 반환하기 때문에 작동하지 않습니다 (이것이 현재 메소드가 작동하지 않는 이유입니다). myObject에 대해 정의 할 때 평등을 결정하는 평등 비교를 수행하려면 Y == X를 대체해야합니다. 닐이 제안한대로 신분증을 추가하거나 Neil이 제안한 것처럼 많은 방법 (두 가지 모두에 대한+s)을 재정의하거나, 정확히 동일한 개체로 식별하기 위해 확인할 myObject의 속성을 결정함으로써이를 수행 할 수 있습니다. .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top