MS Access multi-select 列表移动器 v2
MS Access multi-select list mover v2
作为下面列出的先前 post 的扩展:
我从这里的一些社区成员那里得到了很大的帮助(感谢@Parfait 和@Erik Von Asmuth 的持续帮助)关于我在编写多 select 时遇到的问题列表移动器。
第一个问题已经解决,但是,我在执行 cmdRemove_Click() 按钮时遇到了一个新问题。问题如下:
我有两个列表框(lfmVocabulary 和 lfmVocabularyAssign)。第一个列表框(lfmVocabulary)有一个multi-select函数来选择要分配给一个单元的词汇,从而转移到lfmVocabularyAssign列表框。我可以 select 并毫无问题地传输 .selected(感谢社区),现在我在将它们从 lfmVocabularyAssign 列表框发送回 lfmVocabulary 时遇到问题。
假设我有词汇 A、B 和 C。我 select A 和 B 被转移,点击 cmdAdd 没有问题。但是,如果我 select A & B 并点击 cmdRemove 将它们传送回第一个列表框,C 将在第二个列表框中取代 A & B!
这是我的代码:
Option Compare Database
Private Sub cmdAdd_Click()
Dim in_clause As String: in_clause = ""
Dim strSQL As String, i As Integer
' ITERATE TO BUILD COMMA-SEPARATED LIST FOR SQL IN() CLAUSE
With Me.lfmVocabulary
For n = 0 To .ListCount - 1
If .Selected(n) = True Then
in_clause = in_clause & .ItemData(n) & ", "
End If
Next n
End With
' REMOVE LAST COMMA AND SPACE
in_clause = Left(in_clause, Len(in_clause) - 2)
strSQL = "SELECT * FROM qryVocabularyDefinitions" _
& " WHERE VocabSpeechDefID IN (" & in_clause & ")"
Me.lfmVocabularyAssign.RowSource = strSQL
Me.lfmVocabularyAssign.RowSourceType = "Table/Query"
Me.lfmVocabularyAssign.Requery
End Sub
Private Sub cmdClearAll1_Click()
Dim n As Integer
With Me.lfmVocabulary
For n = 0 To .ListCount - 1
.Selected(n) = False
Next n
End With
End Sub
Private Sub cmdClearAll2_Click()
Dim n As Integer
With Me.lfmVocabularyAssign
For n = 0 To .ListCount - 1
.Selected(n) = False
Next n
End With
End Sub
Private Sub cmdRemove_Click()
Dim in_clause As String: in_clause = ""
Dim strSQL As String, i As Integer
' ITERATE TO BUILD COMMA-SEPARATED LIST FOR SQL IN() CLAUSE
With Me.lfmVocabularyAssign
For n = 0 To .ListCount - 1
If .Selected(n) = True Then
in_clause = in_clause & .ItemData(n) & ", "
End If
Next n
End With
' REMOVE LAST COMMA AND SPACE
in_clause = Left(in_clause, Len(in_clause) - 2)
strSQL = "SELECT * FROM qryVocabularyDefinitions" _
& " WHERE VocabSpeechDefID NOT IN (" & in_clause & ")"
Me.lfmVocabularyAssign.RowSource = strSQL
Me.lfmVocabularyAssign.RowSourceType = "Table/Query"
Me.lfmVocabularyAssign.Requery
End Sub
Private Sub cmdSelectAll1_Click()
Dim n As Integer
With Me.lfmVocabulary
For n = 0 To .ListCount - 1
.Selected(n) = True
Next n
End With
End Sub
Private Sub cmdSelectAll2_Click()
Dim n As Integer
With Me.lfmVocabularyAssign
For n = 0 To .ListCount - 1
.Selected(n) = True
Next n
End With
End Sub
Private Sub cmdAssign_Click()
:(
End Sub
Private Sub Form_Load()
Me.lfmVocabulary.RowSource = "qryVocabularyDefinitions"
Me.lfmVocabulary.RowSourceType = "Table/Query"
Me.lfmVocabulary.Requery
End Sub
好吧,你 运行 遇到了一个明显的问题,因为@Parfait 他对你最初问题的解决方案使得来回移动项目变得更加困难,因为它们是使用查询拉入的。我假设他的解决方案项目不会从第一个列表中删除,只会添加到第二个列表中。如果是这样,这应该有效:
Private Sub cmdRemove_Click()
Dim in_clause As String: in_clause = ""
Dim strSQL As String, n As Integer
'Set the SQL to the current SQL
strSQL = Me.lfmVocabularyAssign.RowSource
' ITERATE TO REMOVE ITEMS FROM COMMA-SEPARATED LIST FOR SQL IN() CLAUSE
With Me.lfmVocabularyAssign
For n = 0 To .ListCount - 1
If .Selected(n) = True Then
If InStr(1, strSQL, ", " & .ItemData(n) ) <> 0 Then
'Not the first item, nor the only item
strSQL = Replace(strSQL, ", " & .ItemData(n), "")
ElseIf InStr(1, strSQL, .ItemData(n) & ", " ) <> 0 Then
'It's the first item
strSQL = Replace(strSQL, .ItemData(n) & ", ", "")
Else
'It's the only item
strSQL = Replace(strSQL, .ItemData(n), "")
End If
End If
Next n
End With
Me.lfmVocabularyAssign.RowSource = strSQL
Me.lfmVocabularyAssign.RowSourceType = "Table/Query"
Me.lfmVocabularyAssign.Requery
End Sub
作为下面列出的先前 post 的扩展:
我从这里的一些社区成员那里得到了很大的帮助(感谢@Parfait 和@Erik Von Asmuth 的持续帮助)关于我在编写多 select 时遇到的问题列表移动器。
第一个问题已经解决,但是,我在执行 cmdRemove_Click() 按钮时遇到了一个新问题。问题如下:
我有两个列表框(lfmVocabulary 和 lfmVocabularyAssign)。第一个列表框(lfmVocabulary)有一个multi-select函数来选择要分配给一个单元的词汇,从而转移到lfmVocabularyAssign列表框。我可以 select 并毫无问题地传输 .selected(感谢社区),现在我在将它们从 lfmVocabularyAssign 列表框发送回 lfmVocabulary 时遇到问题。
假设我有词汇 A、B 和 C。我 select A 和 B 被转移,点击 cmdAdd 没有问题。但是,如果我 select A & B 并点击 cmdRemove 将它们传送回第一个列表框,C 将在第二个列表框中取代 A & B!
这是我的代码:
Option Compare Database
Private Sub cmdAdd_Click()
Dim in_clause As String: in_clause = ""
Dim strSQL As String, i As Integer
' ITERATE TO BUILD COMMA-SEPARATED LIST FOR SQL IN() CLAUSE
With Me.lfmVocabulary
For n = 0 To .ListCount - 1
If .Selected(n) = True Then
in_clause = in_clause & .ItemData(n) & ", "
End If
Next n
End With
' REMOVE LAST COMMA AND SPACE
in_clause = Left(in_clause, Len(in_clause) - 2)
strSQL = "SELECT * FROM qryVocabularyDefinitions" _
& " WHERE VocabSpeechDefID IN (" & in_clause & ")"
Me.lfmVocabularyAssign.RowSource = strSQL
Me.lfmVocabularyAssign.RowSourceType = "Table/Query"
Me.lfmVocabularyAssign.Requery
End Sub
Private Sub cmdClearAll1_Click()
Dim n As Integer
With Me.lfmVocabulary
For n = 0 To .ListCount - 1
.Selected(n) = False
Next n
End With
End Sub
Private Sub cmdClearAll2_Click()
Dim n As Integer
With Me.lfmVocabularyAssign
For n = 0 To .ListCount - 1
.Selected(n) = False
Next n
End With
End Sub
Private Sub cmdRemove_Click()
Dim in_clause As String: in_clause = ""
Dim strSQL As String, i As Integer
' ITERATE TO BUILD COMMA-SEPARATED LIST FOR SQL IN() CLAUSE
With Me.lfmVocabularyAssign
For n = 0 To .ListCount - 1
If .Selected(n) = True Then
in_clause = in_clause & .ItemData(n) & ", "
End If
Next n
End With
' REMOVE LAST COMMA AND SPACE
in_clause = Left(in_clause, Len(in_clause) - 2)
strSQL = "SELECT * FROM qryVocabularyDefinitions" _
& " WHERE VocabSpeechDefID NOT IN (" & in_clause & ")"
Me.lfmVocabularyAssign.RowSource = strSQL
Me.lfmVocabularyAssign.RowSourceType = "Table/Query"
Me.lfmVocabularyAssign.Requery
End Sub
Private Sub cmdSelectAll1_Click()
Dim n As Integer
With Me.lfmVocabulary
For n = 0 To .ListCount - 1
.Selected(n) = True
Next n
End With
End Sub
Private Sub cmdSelectAll2_Click()
Dim n As Integer
With Me.lfmVocabularyAssign
For n = 0 To .ListCount - 1
.Selected(n) = True
Next n
End With
End Sub
Private Sub cmdAssign_Click()
:(
End Sub
Private Sub Form_Load()
Me.lfmVocabulary.RowSource = "qryVocabularyDefinitions"
Me.lfmVocabulary.RowSourceType = "Table/Query"
Me.lfmVocabulary.Requery
End Sub
好吧,你 运行 遇到了一个明显的问题,因为@Parfait 他对你最初问题的解决方案使得来回移动项目变得更加困难,因为它们是使用查询拉入的。我假设他的解决方案项目不会从第一个列表中删除,只会添加到第二个列表中。如果是这样,这应该有效:
Private Sub cmdRemove_Click()
Dim in_clause As String: in_clause = ""
Dim strSQL As String, n As Integer
'Set the SQL to the current SQL
strSQL = Me.lfmVocabularyAssign.RowSource
' ITERATE TO REMOVE ITEMS FROM COMMA-SEPARATED LIST FOR SQL IN() CLAUSE
With Me.lfmVocabularyAssign
For n = 0 To .ListCount - 1
If .Selected(n) = True Then
If InStr(1, strSQL, ", " & .ItemData(n) ) <> 0 Then
'Not the first item, nor the only item
strSQL = Replace(strSQL, ", " & .ItemData(n), "")
ElseIf InStr(1, strSQL, .ItemData(n) & ", " ) <> 0 Then
'It's the first item
strSQL = Replace(strSQL, .ItemData(n) & ", ", "")
Else
'It's the only item
strSQL = Replace(strSQL, .ItemData(n), "")
End If
End If
Next n
End With
Me.lfmVocabularyAssign.RowSource = strSQL
Me.lfmVocabularyAssign.RowSourceType = "Table/Query"
Me.lfmVocabularyAssign.Requery
End Sub