如何在用户键入时自动填充combox?

时间:2019-06-16 10:40:35

标签: ms-access access-vba

我的名为districtCombo的组合框绑定到名为carDistrict的字段。为了帮助我节省更新CarDistrict字段的时间,我希望能够在用户键入时自动填充组合框。

我想到了在select事件中使用districtCombo_Change语句,但是我什么也没收到,甚至没有任何错误消息。

有办法解决这个问题吗?还是有更好的建议?

Private Sub districtCombo_Change()
    Dim Task As String
    Task = "SELECT carDistrict FROM tblCars ORDER BY tblCars.districtCombo"
    Me.districtCombo.RowSource = Task
End Sub()

我想我的第二次尝试使我更加靠近。我已经完全放弃了Change事件,并构造了一个Form_Load事件,如下所示:

Private Sub Form_Load()

Me.RecordSource = "tblCars"
districtCombo.ControlSource = "carDistrict"
districtCombo.RowSourceType = "Table/Query"
districtCombo.RowSource = "SELECT carDistrict FROM tblCars"

End Sub

问题是,组合框显示所有值,包括重复值和空字段。有没有一种方法可以过滤组合框项目,以便仅显示由相同字符串组成的一个项目?

我想我越来越近了,但是我遇到了另一个问题。如果输入的值不在列表中,则不允许将其添加到表中。有办法吗?下面更新了代码:

Private Sub Form_Load()

Me.RecordSource = "tblCars"
districtCombo.ControlSource = "carDistrict"
districtCombo.RowSourceType = "Table/Query"
districtCombo.RowSource = "SELECT distinct carDistrict FROM tblCars WHERE 
carDistrict Is Not null"

End Sub

Private Sub districtCombo_NotInList(NewData As String, Response As Integer)
Dim rs As DAO.Recordset

 Set rs = CurrentDb.OpenRecordset("tblCars")
 rs.AddNew
 rs!carDistrict = NewData
 rs.Update
 End Sub

 Private Sub districtCombo_AfterUpdate()
 Me.Requery
 End Sub

rs.Update部分出现错误。

最后,这就是我想要的:

'Set the Limit to list property of the combobox to No

Private Sub Form_Load()
Me.RecordSource = "tblCars"
districtCombo.ControlSource = "carDistrict"
districtCombo.RowSourceType = "Table/Query"
districtCombo.RowSource = "SELECT distinct carDistrict FROM tblCars WHERE 
carDistrict Is Not null"
End Sub

Private Sub districtCombo_AfterUpdate()
Me.Requery
End Sub

1 个答案:

答案 0 :(得分:0)

如果组合框具有包含所有可用选项的有效行源,则行源中的项目将作为用户类型自动显示在组合框中。

如果可能值的列表未存储在单独的表中(如遵循database normalisation的规则一样),则可以通过以下方式用所有可能的值填充组合框:将行源指定为类似以下内容的

select distinct cardistrict from tblcars where cardistrict is not null

添加新值后,您还需要刷新行源数据集。

一种实现此目的的方法是在Requery事件的事件处理程序中调用组合框控件的AfterUpdate方法:

Private Sub districtCombo_AfterUpdate()
    districtCombo.Requery
End Sub

请注意,不需要这些属性(例如记录源和组合框控件源,行源和行源类型)不需要填写在表单的Load事件上,但是可以在表单设计中进行配置。