0

私はそれに付けられたListViewとを持っItemActivateています。通常、私はイベントをトリガーしたものlistview.SelectedItems[0]を取得するために使用します。ListViewItem

SelectedIndexChanged今度は、アイテムが選択されるとすぐにアクティブ化できるように、サブスクライブしたいと思います。

残念ながら、これらの両方のイベントのsenderおよびeは、イベントをトリガーしたアイテムを返しません(私が知る限り!)。

回避策は、のようなフィールドをlvSelectedItem作成し、その中にアクティブなアイテムを格納することです...しかし、どうすればこれをより良い方法で行うことができますか?どういうわけか、選択したアイテムを送信者またはeventargsから直接取得できますか?

これが私のコードです:

    private void lvPins_ItemActivate(object sender, EventArgs e)
    {
        var item = lvPins.SelectedItems[0];
        var pin = item.Tag as Pin;
        OnPinActivated(pin);
    }

    private void lvPins_SelectedIndexChanged(object sender, System.EventArgs e)
    {
        var item = lvPins.SelectedItems[0]; //this always cause argumentoutofrange exceotion
        var pin = item.Tag as Pin;
        OnPinActivated(pin);
    }
4

1 に答える 1

2

MSDNドキュメントからSelectedIndexChanged

ListViewコントロールで選択されているアイテムを確認するには、SelectedItemsプロパティを使用してListView.SelectedListViewItemCollectionにアクセスします。

イベント引数から新しく選択されたアイテムにアクセスすることはできません。

への参照を保持したくない場合は、にアクセスするためにListViewを使用できます。sender

 ((ListView)sender).SelectedItems

投稿されたコードに従って更新します。

SelectedIndexChangedは2回解雇されたと思います:

  • リストする古い選択されたアイテムを削除するときSelectedItems(そしてあなたは空のリストを取得します)
  • 新しく選択したアイテムをSelecteditemsリストに追加するとき(2回目に選択したアイテムを取得します)

コードを次のように変更してみてください。

if (lvPins.SelectedItems.Count > 0)
{
    var item = lvPins.SelectedItems[0]; //the second time you will get the selected item here
    var pin = item.Tag as Pin;
    OnPinActivated(pin);
}
于 2012-07-18T21:25:25.927 に答える