.NET ListView : event after changing selection

标签 .net winforms listview

在 ListView 控件上,我需要在选择更改后触发一个事件,但每个用户操作仅触发一次。如果我只是使用 SelectedIndexChanged,则该事件在大多数情况下会触发两次(一次是在取消选择前一个元素时触发,另一次是在选择新元素时触发)如果用户仅单击控件一次事件。

这两个事件相继快速触发,但是当选择更改时我所做的计算需要时间(几乎一秒),因此会执行两次并减慢界面速度。

我想做的是每个用户操作只执行一次(在选择新元素之前执行此操作是无用的),但我无法知道该事件是否只是一对中的第一个(以便跳过第一个计算)因为如果用户刚刚取消选择所选元素,它只会触发一次。

我无法使用 Click 或 MouseClick 事件,因为如果用户在列表外部单击以删除选择,这些事件根本不会触发。

感谢您的帮助。

最佳答案

这是我在 VB.NET 中的解决方案,使用 ObjectListView 中描述的技术根据Grammarian的建议:

Private idleHandlerSet As Boolean = False

Private Sub listview1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listview1.SelectedIndexChanged
    '' may fire more than once
    If Not idleHandlerSet Then
        idleHandlerSet = True
        AddHandler Application.Idle, New EventHandler(AddressOf listview1_SelectionChanged)
    End If
End Sub

Private Sub listview1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    '' will only fire once
    idleHandlerSet = False
    RemoveHandler Application.Idle, New EventHandler(AddressOf listview1_SelectionChanged)
    DoSearch()
End Sub

关于.NET ListView : event after changing selection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1191920/

相关文章:

c# - 将图像 Assets 保存到 UWP 中本地文件夹中的存储文件

c# - 将站点从 .net 2.0 升级到 3.5 的问题

c# - 如何避免 Winforms 中 ToolStrip 左侧出现 3 个像素间隙?

c# - 不支持关键字。参数名称 : integrated security

android - 添加 View 使 fragment 内的 ListView 刷新

android - 在 ListView 中格式化文本(从数据库填充)

c# - Swagger - 隐藏 api 版本参数

c# - 对集合进行排序时调用 CompareTo 方法多少次?

c# - 如何将数据从 WebBrowser 控件中的 JavaScript 返回到 C#?

java - Android SwipeViews + TitleStrip + ListView