删除select MultiExtended ListBox 离开的所有项目并且不select 进入任何项目

Deselect all items on leave of MultiExtended ListBox and don't select any items on enter

我的程序中有一个 ListBox,SelectionMode 设置为 MultiExtended。 ListBox 中的项目由用户通过 TextBox 添加。目前,选择 ListBox 中的项目的唯一目的是删除这些项目,目前通过右键单击所选项目来完成。

我还想允许用户通过按 Delete 键删除所选项目,只要 ListBox 是获得焦点的控件。当焦点控件变成任何其他控件时,我希望清除所选项目,我这样做是:

Private Sub LstbxTaskIDs_Leave(sender As Object, e As EventArgs) Handles lstbxTaskIDs.Leave
    lstbxTaskIDs.ClearSelected()
End Sub

这部分工作正常,但是如果用户点击回到列表框,而不是点击一个项目(即控件的空白区域),那么要么是第一个项目,要么是之前选择的项目(取决于是否之前只选择了一个或多个项目)会自动选择。或者,更简洁地说:

  1. 用户选择列表框中的项目。
  2. 用户点击了表单的其他地方。
  3. 已取消选择所选项目。
  4. 用户点击列表框的空白区域。
  5. 自动选择第一项(或最后选择的项目)。

我唯一想要的更改是在重新进入列表框时不再自动选择任何项目。 (注意:仅当先前选择了某个项目时,才会自动选择该项目。如果您在选择某个项目之前单击空白区域,则不会自动选择任何项目。)

这是我试过的,但似乎没有任何改变:

Private Sub LstbxTaskIDs_Enter(sender As Object, e As EventArgs) Handles lstbxTaskIDs.Enter
    lstbxTaskIDs.ClearSelected()
End Sub

我也试过用lstbxTaskIDs.SelectedItems.Clear()lstbxTaskIDs.SelectedItem = -1

替换lstbxTaskIDs.ClearSelected()
BeginInvoke(new Action(Sub() lstbxTaskIDs.ClearSelected()))

仍将 select 然后取消 select 列表框中的项目,这会引发 SelectedIndexChanged 事件。

为避免这种情况,请尝试 intercepting the MouseDown 并查看它是否点击了空的 space。

Public Class ListBoxEx
  Inherits ListBox

  Private Const WM_LBUTTONDOWN As Integer = &H201

  Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg = WM_LBUTTONDOWN Then
      Dim pt As New Point(m.LParam.ToInt32)
      If Me.IndexFromPoint(pt) = -1 Then
        Return
      End If
    End If
    MyBase.WndProc(m)
  End Sub

End Class