【问题标题】:How to get ListViewItem in ItemActivate event如何在 ItemActivate 事件中获取 ListViewItem
【发布时间】:2012-07-18 21:19:25
【问题描述】:

我有一个ListView,并附有ItemActivate。通常我只会使用listview.SelectedItems[0] 来获取触发事件的ListViewItem

现在我也想订阅SelectedIndexChanged,以便项目在被选中后立即激活。

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

一种解决方法是有一个像lvSelectedItem 这样的字段并将活动项目存储在其中......但是我怎样才能更好地做到这一点?不知何故,我可以直接从 sender 或 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);
    }

【问题讨论】:

  • 看看我的答案更新

标签: c# winforms events listview listviewitem


【解决方案1】:

来自SelectedIndexChangedMSDN documentation

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

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多