【问题标题】:Deselect all items on leave of MultiExtended ListBox and don't select any items on enter取消选择 MultiExtended ListBox 离开的所有项目,并且不选择任何进入的项目
【发布时间】:2020-01-02 01:56:30
【问题描述】:

我的程序中有一个 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()))
  • @Jimi 将它放在 Enter 处理程序中,它完全按照我的期望工作,谢谢!

标签: vb.net winforms listbox selecteditem


【解决方案1】:
BeginInvoke(new Action(Sub() lstbxTaskIDs.ClearSelected()))

仍将选择然后取消选择 ListBox 中的项目,这会引发 SelectedIndexChanged 事件。

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

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

【讨论】:

  • 啊。这可能会在项目的后期给我带来麻烦,我不明白为什么。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2016-04-29
  • 2013-03-02
相关资源
最近更新 更多