多 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 列表框问题的其他人有所帮助...
我一直在研究拖放功能,该功能模拟将一个列表框(为简洁起见,我们将其称为列表 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 列表框问题的其他人有所帮助...