这里的Access新手,已经花了很多时间试图解决这个问题,所以这里有背景:
注意:已经看过这个:ComboBox won't allow me to select an item,但没有提供我需要的答案。
我有一个数据库,允许一个人通过表单输入和存储客户详细信息,目前我有3个表,其中包含以下关系:
客户 - CustomerID(PK) - 名字 - LastName
过程 - ProcessID(PK) - 细节 - PartsUse -
作业 - JobID(PK) - 客户ID(FK) - ProcessID(FK) - MachineDetail -
客户与Job有1-M关系,但通过扩展(不确定原因)Process也与Job有1-M关系。所以这里的目标是一个客户可以有很多工作,一个工作应该只有一个工作(以后需要修复)。
现在我的代码是以我的NewJob形式绑定ComboBox - 其目的是在表单打开时使用客户的所有名称填充ComboBox,并且仅允许用户在之后输入作业详细信息已选择客户:
Private Sub Form_Open(Cancel As Integer)
Dim db As Database
Dim recordSet As DAO.recordSet
Dim sql As String
sql = "SELECT [Customer].[CustomerID], [Customer].[FirstName] & [Customer].[LastName] FROM Customer ORDER BY [CustomerID];"
'clear all fields
ClearJobFormFields
'disable all controls until a customer is selected
DisableJobFormControls
With cmbCustomer
.ControlSource = "Customer"
.RowSource = sql
.ColumnCount = 2
.ColumnWidths = "1cm; 3cm"
.BoundColumn = 0
End With
cmbCustomer.ControlSource = "Customer"
cmbCustomer.RowSource = sql
End Sub
请注意,每个表单都是独立的 - 我没有使用子表单。它所在的表单(NewJob)DOES将AllowEdit
设置为yes,表单中没有绑定RecordSource
。
ComboBox正确填充,但每当我尝试选择一个项目时,我都会收到错误:"控件无法编辑,它绑定到未知字段客户"。
这就是它的全部内容。对不起,如果这是一个常见/易于解决的问题,但它已经困扰了我好几天。
答案 0 :(得分:0)
如果您的表单没有Recordsource,则您的控件不应该(不能)拥有Controlsource。如果您在设计模式下转到表单的属性,您将在Controlsource属性中看到Customer不是有效选项。 为什么不拥有Recordsource。输入工作数据不是表格的目标吗?
答案 1 :(得分:0)
当您通过VBA设置rowsource属性时,您应该将其保留为unbond控件并废弃:
cmbCustomer.ControlSource = "Customer"
您的开放式表单应该更像这样:
Private Sub Form_Open(Cancel As Integer)
Dim db As Database
Dim recordSet As DAO.recordSet
Dim sql As String
sql = "SELECT [Customer].[CustomerID], [Customer].[FirstName] & [Customer].[LastName] FROM Customer ORDER BY [CustomerID];"
'clear all fields
ClearJobFormFields
'disable all controls until a customer is selected
DisableJobFormControls
With cmbCustomer
.RowSource = sql
.ColumnCount = 2
.ColumnWidths = "1cm; 3cm"
.BoundColumn = 0
End With
End Sub
然后您可以使用此组合框的更新后事件来确定是否启用作业详细信息字段:
Private Sub cmbCustomer_AfterUpdate()
'Check it's populated and set fields as necessary
If cmbCustomer & "" = "" Then
txtJobDetails.Enabled = 0 'Change this fieldname as required
Else
txtJobDetails.Enabled = -1
End If
End Sub