如何在ItemActivate事件中获取ListViewItem

时间:2012-07-18 21:19:26

标签: c# winforms events listview listviewitem

我附加ListView ItemActivate。通常我会使用listview.SelectedItems[0]来获取触发事件的ListViewItem

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

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

解决方法是使用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);
    }

1 个答案:

答案 0 :(得分:2)

来自SelectedIndexChanged的{​​{3}}:

  

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