【问题标题】:Get items in order selected from listbox按从列表框中选择的顺序获取项目
【发布时间】:2014-10-21 15:09:38
【问题描述】:

如果用户已经选择了超过 3 个项目,我想取消选择最后选择的索引(仅允许用户删除选择)。

sender.selectedIndex 返回第一个选定的列表框项目,而不是最后一个(按时间顺序)。有没有人有任何提示我可以如何实现这一目标?

示例(* 已选择)

item1
*item2
item3
*item4
item5

如果我选择 item3,则 sender.selectedIndex 包含 item2(第一项),sender.selectedItems 包含 item2、item3、item4,所以我无法判断哪个是新的。

【问题讨论】:

  • listBOX(来自问题文本)或listVIEW(标题)差别很大
  • 非常抱歉。我的意思是列表框,但如果您可以指定最多 3 个选定项目,也会考虑使用列表视图
  • selectedItems 集合按照它们在列表框中出现的顺序存储选择。我想获得最后一个选定的项目(按时间)。我会更新问题。
  • 对不起,我有一个可以按顺序存储它们,但忘记了这是我添加的。您必须创建自己的集合并在他们选择项目时对其进行更新。
  • 所以你有两个集合(旧的和新的)并比较它们以获得添加的项目?对于本来应该很简单的事情,这不是矫枉过正吗?

标签: vb.net winforms listbox


【解决方案1】:

您需要根据需要跟踪和比较您自己的列表与SelectedIndexes 更新。显然,LB 只是迭代 items 集合以构建 Selecteditems 集合,因此它始终与 items 的顺序相同。

是不是有点矫枉过正?仅当应用程序并不真正需要这种详细程度时。否则,如果你需要它,你需要它。

Private cList As New List(Of Integer)       ' our new Selected Indicies

Private Sub lb_SelectedIndexChanged(sender As Object, 
        e As EventArgs) Handles lb.SelectedIndexChanged

    Dim ndxCol As ListBox.SelectedIndexCollection
    ndxCol = lb.SelectedIndices

    ' add missing ones
    For Each n As Integer In ndxCol
        If cList.Contains(n) = False Then
            cList.Add(n)
        End If
    Next

    ' remove old ones
    For n As Integer = cList.Count - 1 To 0 Step -1
        If ndxCol.Contains(cList(n)) = False Then
            cList.Remove(cList(n))
        End If
    Next

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多