多 Select 列表框通过一次用户单击选择多个条目

Multi Select Listbox selecting multiple entries with a single user click

我一直在研究拖放功能,该功能模拟将一个列表框(为简洁起见,我们将其称为列表 A)中的记录移动到另一个列表框(列表 B)并再次移动回来的效果。列表框被配置为简单的 select 以允许用户在单个动作中移动尽可能多的记录。列表框从访问本地表中获取它们的数据,并且在每次传输后重新查询它们以更新列表框。

问题是:在我将数据从列表 A 移到列表 B 后又回到列表 A 等,在可变数量(2 个或更多)的交易之后出现了一个点,其中 selecting a任一列表中的单个条目(即单击一次)似乎一次突出显示多个记录。通常,突出显示的记录甚至不是正在 selected 的记录的相邻记录。此外,当用户创建另一个 selection 时,Access 似乎偶尔会丢失 selected 记录上的突出显示,或者当用户单击它时不会突出显示用户 selection。

测试已经确定,有时这些故障纯粹是装饰性的,有时它们会影响传输过程的行为。最终结果是有时只是图形显示错误,有时用户没有select的条目被转移。我不确定这是否纯粹是 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

进行了一些调查以弄清楚这一点,但我终于破译了这里的问题。我的列表框的 .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 列表框问题的其他人有所帮助...