多选列表框,只需单击一次即可选择多个条目

时间:2018-02-01 20:21:49

标签: vba drag-and-drop listbox ms-access-2016

我一直致力于拖放功能,模拟将记录移动到一个列表框(我们称之为简洁列表A)的效果到另一个列表框(列表B)并再次返回。列表框配置为简单选择,以允许用户移动与在单个动作中突出显示的记录一样多的记录。列表框从访问本地表中获取数据,并在每次传输后重新获取它们以更新列表框。

问题在于:在将数据从列表A移动到列表B回到列表A等之后,在可变数量(2个或更多)的事务之后出现了一个点,其中在任一列表中选择单个条目(即单击一下)似乎一次突出显示多个记录。通常,突出显示的记录甚至不是所选记录的相邻记录。此外,当用户进行另一次选择时,Access似乎偶尔会丢失所选记录上的突出显示,或者当用户点击它时不突出显示用户选择。

测试已经确定有时这些故障纯粹是装饰性的,有时它们会影响转移过程的行为。最终结果是有时只是图形显示是错误的,有时用户未选择的条目被传输。我不确定这是否纯粹是一个Access故障,或者我是否可以在VB中做一些事情来纠正这个问题,但我希望你们其中一个人有一个可以帮助我的想法。

我附加了负责将数据从ListYard移动到ListContainer的子代码。相反的方向有一个反映这一个的子。如果您需要更多代码,我可以提供它。由于这是一个原型,数据库本身不会被拆分,并且其中只有测试数据。 感谢您的帮助,我真的不确定是什么导致了这个问题。

Private Sub objDD_BeforeDrop(ctlSource As ListBox, ctlTarget As Control, strMoveIDs As String)   
    Dim arrMoveIDs() As String
    Dim i As Integer
    Dim dbs As DAO.Database
    Dim qdfYTD As DAO.QueryDef
    Dim qdfCTA As DAO.QueryDef

    Me.txtTargetList1 = ""
    Me.txtTargetList2 = ""
    If TypeOf ctlTarget Is Access.TextBox Then
        ctlTarget.Value = strMoveIDs
    Else
        Me.txtTargetList2 = strMoveIDs
    End If

    Set dbs = CurrentDb
    Set qdfYTD = dbs.QueryDefs("qryYardTempDelete")
    Set qdfCTA = dbs.QueryDefs("qryContainerTempAppend")

    If InStr(strMoveIDs, ",") > 0 Then
        arrMoveIDs = Split(strMoveIDs, ",")

        For i = 0 To UBound(arrMoveIDs)
            qdfYTD.Parameters(0).Value = CSng(arrMoveIDs(i))
            qdfYTD.Execute
            qdfYTD.Close
            qdfCTA.Parameters(0).Value = CSng(arrMoveIDs(i))
            qdfCTA.Execute
            qdfCTA.Close
        Next

    Else
            qdfYTD.Parameters(0).Value = CSng(strMoveIDs)
            qdfYTD.Execute
            qdfYTD.Close
            qdfCTA.Parameters(0).Value = CSng(strMoveIDs)
            qdfCTA.Execute
            qdfCTA.Close
    End If

    'Me!ctlListYard = ""
    'Me!ctlListContainer = ""

    Me!ctlListYard.Requery
    Me!ctlListContainer.Requery

    Me!ctlListYard.SetFocus
    Me!ctlListYard.ListIndex = -1
    Me!ctlListContainer.SetFocus
    Me!ctlListContainer.ListIndex = -1

    Set qdfYTD = Nothing
    Set qdfCTA = Nothing
    Set dbs = Nothing

End Sub

1 个答案:

答案 0 :(得分:0)

进行了一些调查以确定这一点,但我终于破解了这里的问题。每个事务后,我的列表框的.ItemsSelected属性都没有被清除。这两个命令无法成功解决此问题:

Me!lstYard.ListIdex = -1 Me!lstYard = ""

我能够通过在每次交易后调用我的列表框中的以下子来成功解决问题:

Public Sub ClearListbox(lst As Access.ListBox)

    Dim lngx As Long

    With lst
    For lngx = (.ItemsSelected.Count - 1) To 0 Step -1
    .Selected(.ItemsSelected(lngx)) = False
    Next lngx
    End With

End Sub

我希望这可以帮助其他人在Access中遇到列表框问题......