ListBoxでアイテムのインデックスを取得する方法はありますか

StackOverflow https://stackoverflow.com/questions/408320

  •  03-07-2019
  •  | 
  •  

質問

次のように 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()は同等性テストのためにオーバーライドする必要はありませんが、デバッグには役立ちます。

他のヒント

GUIDなど、リストボックスの値に何らかの種類のキーを使用できます。その後、 myListBox.Items.FindByValue(value)を使用して適切なアイテムを簡単に見つけることができます。

IndexOfは参照をチェックするため、otherListOfMyObjectsのアイテムがメモリ内の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を返すため機能しません(そのため、現在のメソッドは機能しません)。 y == xを代入して、等値比較を実行して、MyObjectに対して定義する等値を決定する必要があります。これを行うには、Fallenが提案したようにIDを追加するか、Neilが提案したようにメソッドのバットロードをオーバーライドします(両方の+を使用)。 。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top