我的名为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
答案 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
事件上,但是可以在表单设计中进行配置。