我有 Access 2010 表单,其中有一个组合框
cmbSubTopic
,其中列出了两列(SubTopicID
和 SubTopic
)。组合框绑定到包含 SubTopicID
的字段。组合框中的 SubTopicID
列被隐藏,仅显示 SubTopic
。当用户从下拉列表中选择 SubTopic
时,相应的 SubTopicID
就会存储在表中。我为表单的加载事件编写了一些 VBA 代码,以在表中查找 SubTopicID
,并在组合框中选择相应的 SubTopic
。我当前的代码是这样的:
Set rsST = dbs.OpenRecordset(strSqlst)
For i = 0 To Me.cmbSubTopic.ListCount - 1
If Me.cmbSubTopic.Column(0, i) = rsST.Fields("SubTopicID").Value Then
Me.cmbSubTopic.SetFocus
Me.cmbSubTopic.Selected(i) = True
Exit For
End If
Next i
这给出了错误:
您输入的文本不是列表中的项目
我也尝试过使用这个:
Me.cmbSubTopic = Me.cmbSubTopic.Selected(i)
这会选择组合框中的项目,但也会将 I 的值写入我不想要的表的
ID
字段中。
假设组合的第一列
SubTopicID
也是其“绑定列”属性,则该列的值将用作组合的 .Value
属性。这意味着您只需为 .Value
分配一个值即可选择匹配的组合行。
Me.cmbSubTopic.Value = rsST.Fields("SubTopicID").Value
这种方法很简单,但我不确定它是否适合您的情况。我们对您的
rsST
记录集一无所知 --- 我推测记录集当前行中的 SubTopicID
字段是您想要在组合中选择的值。如果我误解了这一点,我们需要找出不同的东西。
如果组合绑定到表单记录源中的字段,此建议也会更改存储的值。如果您不想这样做,请“取消绑定”组合 --- 换句话说,将其 Control Source 属性留空。
这里有 2 个子主题 - 一个用于传递文本 (SubTopic),第二个用于传递 ID (SubTopicId):
Public Sub SelectComboBoxItemByText(cmb As ComboBox, Value As String)
On Error GoTo ErrHandler_
Dim i As Integer
For i = 0 To cmb.ListCount - 1
If cmb.Column(1, i) = Value Then
cmb.SetFocus
cmb.Selected(i) = True
cmb.Text = Value
Exit For
End If
Next i
End Sub
ExitProc_:
DoCmd.Hourglass False
Exit Sub
ErrHandler_:
DoCmd.Hourglass False
Call LogError(Err, "basTools", "SelectComboBoxItemByText")
Resume ExitProc_
Resume ' use for debugging
End Sub
Public Sub SelectComboBoxItemById(cmb As ComboBox, Value As Integer)
On Error GoTo ErrHandler_
Dim i As Integer
For i = 0 To cmb.ListCount - 1
If cmb.Column(0, i) = Value Then
cmb.SetFocus
cmb.Selected(i) = True
cmb = Value
Exit For
End If
Next i
ExitProc_:
DoCmd.Hourglass False
Exit Sub
ErrHandler_:
DoCmd.Hourglass False
Call LogError(Err, "basTools", "SelectComboBoxItemById")
Resume ExitProc_
Resume ' use for debugging
End Sub
您可以将 ItemData(idx) 分配给您的组合框:
'Change the combobox slection to the second item
'(index starts with zero)
cmb = cmb.ItemData(1)
请注意,我一直在使用 MS Access 2007。最新版本可能不再允许此分配。