我有一个products
表和一个具有多对多关系的tags
表。我还有一个数据透视表,用于存储产品ID和标签ID。
我希望能够在组合框中显示标记文本但是存储id。这本身就很简单,因为我可以调整id的列宽,但是,我试图将LimitToList
设置为No
,这样我就可以实现一些VBA来过滤列表了我输入组合框,但只有当第一列是绑定列时才会出现这种情况,这意味着标记ID出现在组合框中而不是文本中。
如何在组合框中显示标记文本并允许' LimitToList'是假的?
答案 0 :(得分:0)
将LimitToList
保留在Yes
上,然后使用组合框的 NotInList
事件。
E.g。
Private Sub cboTag_NotInList(NewData As String, Response As Integer)
Dim RS As Recordset
If MsgBox("Do you want to add '" & NewData & "' as new Tag?", vbYesNo + vbQuestion) _
= vbYes Then
' Add the new tag
Set RS = CurrentDb.OpenRecordset("tbTags")
With RS
.AddNew
!Tag_Text = NewData
.Update
.Close
End With
Response = acDataErrAdded
Else
Response = acDataErrDisplay
' Or a user defined MsgBox and acDataErrContinue
End If
End Sub
答案 1 :(得分:0)
要在用户键入标记的一部分时过滤组合框,您可以使用Change
事件。这适用于LimitToList = Yes
。
Private Sub cboTag_Change()
Me.cboTag.RowSource = _
"SELECT Tag_ID, Tag_Text FROM tbTags WHERE Tag_Text LIKE '*" & Me.cboTag.Text & "*'"
' With the instant filtering, it is more convenient for the user
' to always see the filtered dropdown
Me.cboTag.Dropdown
End Sub
当然,在某些时候用户必须从列表中选择一个标签。否则将无法存储在该字段中的ID 或者,如果您希望他能够添加新标签,请使用其他答案中的代码。这两个事件都是一起写的。
答案 2 :(得分:0)
搜索即用型技术描述非常好here,包括在键入几个字符后从打开的下拉组合框中自动选择项目。