Как получить ListViewItem в событии ItemActivate

У меня есть 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);
    }

person Saeid Yazdani    schedule 18.07.2012    source источник
comment
посмотри на мое обновление ответа   -  person eyossi    schedule 19.07.2012


Ответы (1)


Из документации MSDN от SelectedIndexChanged:

Чтобы определить, какие элементы выбраны в элементе управления ListView, используйте свойство SelectedItems для доступа к ListView.SelectedListViewItemCollection.

Вы не можете получить доступ к новому выбранному элементу/элементам из аргументов события.

Если вы не хотите сохранять ссылку на ListView, вы можете использовать sender для доступа к нему:

 ((ListView)sender).SelectedItems

ОБНОВЛЕНИЕ В СООТВЕТСТВИИ С РАЗМЕЩЕННЫМ КОДЕКОМ:

Я думаю, что SelectedIndexChanged срабатывает дважды:

  • При удалении старых выбранных элементов в список SelectedItems (и тогда вы получаете пустой список)
  • При добавлении новых выбранных элементов в список Selecteditems (тогда во второй раз вы получите выбранный элемент)

попробуйте изменить свой код на это:

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);
}
person eyossi    schedule 18.07.2012