Vb.net 右键单击时停止选择列表视图中的项目

Vb.net 右键单击时停止选择列表视图中的项目,vb.net,listview,contextmenu,right-click,contextmenustrip,Vb.net,Listview,Contextmenu,Right Click,Contextmenustrip,我在VB 2010中的Windows窗体上有一个ListView 我已将ListView的MultiSelect属性设置为False,以便在任何时候只能选择一项 我已经为列表视图配置了一个上下文菜单,当右键单击列表视图时,它会正确显示 [在设计器中添加了一个ContextMenuStrip控件,并将ListView的ContextMenuStrip属性设置为该控件。] 考虑以下两种情况: 用户右键单击已在列表视图中选择的项目。然后显示关联菜单,没有问题 用户右键单击除已在列表视图中选择的项目之外

我在VB 2010中的Windows窗体上有一个ListView

我已将
ListView
MultiSelect
属性设置为
False
,以便在任何时候只能选择一项

我已经为
列表视图
配置了一个上下文菜单,当右键单击
列表视图
时,它会正确显示

[在设计器中添加了一个
ContextMenuStrip
控件,并将
ListView
ContextMenuStrip
属性设置为该控件。]

考虑以下两种情况:

  • 用户右键单击已在
    列表视图中选择的项目。然后显示关联菜单,没有问题

  • 用户右键单击除已在
    列表视图中选择的项目之外的项目,然后在显示关联菜单之前,选择用户右键单击的项目

  • If e.Button = Windows.Forms.MouseButtons.Right Then
        //display context menu because you're handling the click event manually.
        ...context menu code...
        Dim ee As New System.Windows.Forms.MouseEventArgs(Forms.MouseButtons.None, e.Clicks, e.X, e.Y, e.Delta)
        e = ee
    End If
    
    在场景2中,我需要停止自动选择用户右键单击的项目。需要显示上下文菜单,但以前选择的项目应保持选中状态。

    我怎样才能做到这一点

    我注意到在
    ListView
    MouseDown
    事件中,
    SelectedItems.Item(0).Index
    属性仍然位于旧索引中。但是,在
    MouseUp
    事件中,此属性将更改为新索引

    MouseDown
    事件处理程序或其他任何地方,如何阻止
    SelectedItems
    的更改?或者如何将其更改回上一个选定的项目(,而用户没有注意到它正在更改,然后又将其更改回

    我可以使用下面的代码在
    MouseDown
    MouseUp
    上单击鼠标右键。但是,我不确定需要在该条件中添加什么来阻止
    SelectedItems
    的更改

        If e.Button = Windows.Forms.MouseButtons.Right Then
            ...
        End If
    
    注意:我可以为此使用以下代码。但是,当我在场景(2)中使用此选项时,它会选择用户右键单击的项目,然后将其更改回上一个项目,用户会看到此更改。因此,无法使用此解决方案

    Dim intPrevSelectedIndex As Integer = -1
    Dim boolCancel As Boolean = False
    Private Sub ListView1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDown
        If ListView1.SelectedItems.Count > 0 AndAlso e.Button = Windows.Forms.MouseButtons.Right Then
                boolCancel = True
                intPrevSelectedIndex = ListView1.SelectedItems(0).Index
            End If
    End Sub
    
    Private Sub ListView1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseUp
        If boolCancel Then
            lstWalkResults.Items(intPrevSelectedIndex).Selected = True
            boolCancel = False
        End If
    End Sub
    

    请告诉我您可能有什么解决方案。谢谢你的时间

    在代码隐藏中,您应该能够处理右键单击事件。在该方法中,您将手动显示关联菜单,然后忽略阻止选择项目的单击事件

    If e.Button = Windows.Forms.MouseButtons.Right Then
        //display context menu because you're handling the click event manually.
        ...context menu code...
        Dim ee As New System.Windows.Forms.MouseEventArgs(Forms.MouseButtons.None, e.Clicks, e.X, e.Y, e.Delta)
        e = ee
    End If
    

    e.Handled=true
    不起作用。我发现错误:
    “Handled”不是“System.Windows.Forms.MouseEventArgs”的成员。
    在MouseEventArgs上快速搜索找到了解决方案。看我修改过的答案,我试过了
    Dim Hme As HandledMouseEventArgs=e
    导致一个错误:
    无法将“System.Windows.Forms.MouseEventArgs”类型的对象强制转换为“System.Windows.Forms.HandledMouseEventArgs”。
    根据我的建议,用您尝试过的内容和错误内容更新您的问题。我提供的答案应该是有效的,请参阅这篇MSDN帖子,它准确地显示了我在回答中向您展示的内容:提供的中提到的
    HandledMouseEventArgs
    类是为了防止
    MouseWheel
    事件被发送到其父容器。它不适用于
    MouseDown
    事件。