0

Access 的新手,已经花了很多时间试图解决这个问题,所以这里是背景:

注意:已经看过这个:ComboBox won't allow me to select an item,但没有提供我需要的答案。

我有一个数据库,允许一个人通过表单输入和存储客户详细信息,目前我有 3 个具有以下关系的表:

客户 - 客户 ID (PK) - 名字 - 姓氏

流程 - ProcessID (PK) - 详细信息 - PartsUse -

作业 - JobID (PK) - CustomerID (FK) - ProcessID (FK) - MachineDetail -

Customer 与 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)上的表单确实AllowEdit设置为yes,并且表单没有RecordSource绑定。

组合框确实填充正确,但每次我尝试选择一个项目时,我都会收到错误消息:“无法编辑控件,它绑定到未知字段客户”。

这就是它的全部。抱歉,如果这是一个常见/易于解决的问题,但它困扰了我好几天。

4

2 回答 2

0

当您通过 VBA 设置 rowsource 属性时,您应该将其保留为未绑定控件并报废:

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

然后您可以使用此组合框的 after update 事件来确定是否启用作业详细信息字段:

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
于 2012-12-21T09:09:34.983 回答
0

如果您的表单没有 Recordsource,则您的控件不应该(不能)有 Controlsource。如果您在设计模式下转到表单的属性,您将看到 Customer 不是 Controlsource 属性中的有效选择。为什么你没有记录源。表单的目的不是输入 Job 数据吗?

于 2012-12-14T09:18:39.497 回答