如何在ItemActivate事件中获取ListViewItem

本文关键字:获取 ListViewItem 事件 ItemActivate | 更新日期: 2024-05-15 22:10:23

我有一个连接了ItemActivateListView。通常我只会使用listview.SelectedItems[0]来获取触发事件的ListViewItem

现在我也想订阅SelectedIndexChanged,这样项目一被选中就可以被激活。

不幸的是,这两个事件的sendere都没有返回触发事件的项(据我所知!)。

一个解决方法是有一个像lvSelectedItem这样的字段并将活动项存储在其中……但我如何才能更好地做到这一点呢?不知怎么的,我可以直接从发件人或事件参数中获取所选项目?

这是我的代码:

    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);
    }

如何在ItemActivate事件中获取ListViewItem

来自SelectedIndexChanged:的MSDN文档

要确定在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);
}