【问题标题】:C# : How do I get the actual item clicked from SelectedIndexChanged for a ListView control?C#:如何获取从 SelectedIndexChanged 中为 ListView 控件单击的实际项目?
【发布时间】:2009-01-22 18:58:09
【问题描述】:

我正在使用具有 listView 的 winForms 应用程序。该 listView 启用了多选,并且我在列表中有很多很多项目(在行视图中)。

当我选择最后一行(即项目)时,然后按住 shift 单击第 5000 行,SelectedIndexChanged 会触发 5000 次。如果发生这种情况,我最终会陷入一个非常讨厌的循环。单击的最后一行不能保证是“SelectedItems”列表中的最后一项。如何获得点击的实际项目?

编辑:更好的说明:如何获得导致 SelectedIndexChanged 事件的特定迭代的 ListViewItem? ...即使我必须检查所有 5000 个。我需要知道我在看哪一个。 EventArgs 没有 index 属性,sender 是 ListView,而不是 ListViewItem。

有什么想法吗?

【问题讨论】:

    标签: c# winforms multithreading


    【解决方案1】:

    哦,为了皮特的爱...(*感觉比石头还笨*)

    我找到了答案。请注意,我使用的是 SelectedIndexChanged。还有一个我应该一直在使用的事件:ItemSelectionChange。

    当使用那个事件时,我现在有一些事件可以告诉我选择中哪些项目发生了变化,它告诉我项目是被选中还是未被选中。很漂亮。

    我希望这可以帮助其他正在解决这个问题的人。

    【讨论】:

      【解决方案2】:

      这是我能想到的最佳解决方案。处理 ListView 的 OnMouseMove 事件。每当鼠标移动时,记录鼠标的位置。然后,当您获得 SelectedIndexChangedEvent 时,您可以调用 ListView.FindNearestItem(SearchDirectionHint, Point) 并将最后一个鼠标坐标作为 Point 参数传递。这应该会为您提供实际点击的项目。

      请注意,您不能依赖它实际返回一个项目。完全可以在不使用鼠标的情况下选择一个项目。几个制表符和空格键就可以了。但对于实际点击,这应该可以解决问题。

      【讨论】:

        【解决方案3】:

        ListView 上有一个名为 HitTest 的方法。通过处理MouseClick 事件,您可以确定最后单击的项目是什么。

        如果您想弄清楚最后选择的项目是什么,请不要忘记键盘。在列表视图控件中,您可以按住Ctrl+(arrow key) 移动焦点矩形,然后点击Ctrl+Space 以添加到选择中。如果你想要最后选择的项目,你也必须处理这个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 2020-06-01
          • 2019-10-04
          • 1970-01-01
          • 2017-09-09
          • 1970-01-01
          相关资源
          最近更新 更多