【问题标题】:Access 2010 - Dynamically Set Combo Control Source and Row SourceAccess 2010 - 动态设置组合控件源和行源
【发布时间】:2020-03-28 16:32:55
【问题描述】:

我必须坚持旧的(凌乱的)桌子设计。在我正在开发的这个界面上,有一个组合下拉列表,它是一个固定值列表。选项为 Group1、Group2 和 Group 3。基于此,需要将依赖组合设置为正确的行源和控制源。

表单被锁定,用户可以浏览记录(第一个、最后一个、下一个上一个,以及一个未绑定的组合以跳转到记录)。在这些操作期间,我只想刷新依赖组合应该从哪个列表中提取,以及它应该绑定到什么值,以显示正确的值。

当用户点击创建“新”记录时,我不会显示相关下拉列表(或启用它。尚未决定),直到他们在第一个组合中选择一个值,告诉我们哪个组是的。

为了控制这一点,我创建了一个用于此表单的函数。这就是那个函数:

Private Function MyGroup()
   'Mybitval is a table value that is a bit data type. It means group1       
   If Me.Mybitval = True Then
        Me.cboGroupType.Value = "Group1"
    ElseIf Me.Mybitval = False And Nz(Me.MyID1, 0) <> 0 Then
        Me.cboGroupType.Value = "Group2"
    ElseIf Me.Mybitval = False And Nz(Me.MyID1, 0) = 0 Then
        Me.cboGroupType.Value = "Group3"
    End If

    Select Case Me.cboGroupType
        Case "Group1"
            Me.cboGroupName.RowSource = "SELECT Group1.ID, Group1.G1Name FROM Group1 ORDER BY Group1.G1Name;"
            Me.cboGroupName.ControlSource = me.FKID1
        Case "Group2"
            Me.cboGroupName.RowSource = "SELECT Group2.ID, Group2.G2Name FROM Group2 ORDER BY Group2.G2Name;"
            Me.cboGroupName.ControlSource = Me.FKID2
        Case "Group3"
            Me.cboGroupName.RowSource = "SELECT Group3.G3ID, Group3.G3Name FROM Group3 ORDER BY Group3.G3Name;"
            Me.cboGroupName.ControlSource = me.FKID1
    End Select

    Debug.Print Me.cboGroupName.RowSource
    Debug.Print Me.cboGroupName.ControlSource
    Debug.Print Me.cboGroupName.Value
End Function

我的想法是我在加载时调用此函数,在我转到第一条记录之后,然后在任何导航按钮上单击或在更新 go to combo 之后。

问题是,cbogroupname 从不显示它在控制源中的值。当我尝试加载表单时,我的调试行源显示了正确的 sql,而控制源显示了它所在的当前记录的正确表字段的值,但有两件事似乎不起作用。如果我不对值进行第 3 次调试,则表单加载正常,但组合不会显示正确的值,即使它绑定到具有值的表列也是如此。如果确实调试该值,我会收到运行时错误“2424”:“您输入的表达式包含 [我的应用程序] 找不到的字段、控件或属性名称。”

当我点击调试时,它转到函数的最后一行: Debug.Print Me.cboGroupName.Value

当我去保存一条新记录时,我会运行验证,并且拥有这 1 个组合,而不是 3 个不同的具有交替可见性的组合,似乎更容易。这有什么原因不能按我想要的方式工作吗?

谢谢!

【问题讨论】:

    标签: vba ms-access combobox ms-access-2010


    【解决方案1】:

    就这样,我想通了。当然,这需要我一整天的时间,然后发布这个问题来得到它。

    下面是函数,语法正确:

    Private Function MyGroup()
    
       If Me.Mybitval = True Then
            Me.cboGroupType.Value = "Group1"
        ElseIf Me.Mybitval = False And Nz(Me.MyID1, 0) <> 0 Then
            Me.cboGroupType.Value = "Group2"
        ElseIf Me.Mybitval = False And Nz(Me.MyID1, 0) = 0 Then
            Me.cboGroupType.Value = "Group3"
        End If
    
        Select Case Me.cboGroupType
            Case "Group1"
                Me.cboGroupName.RowSource = "SELECT Group1.ID, Group1.G1Name FROM Group1 ORDER BY Group1.G1Name;"
                Me.cboGroupName.ControlSource = "FKID1"
            Case "Group2"
                Me.cboGroupName.RowSource = "SELECT Group2.ID, Group2.G2Name FROM Group2 ORDER BY Group2.G2Name;"
                Me.cboGroupName.ControlSource = "FKID2"
            Case "Group3"
                Me.cboGroupName.RowSource = "SELECT Group3.G3ID, Group3.G3Name FROM Group3 ORDER BY Group3.G3Name;"
                Me.cboGroupName.ControlSource = "FKID1"
        End Select
    
        Debug.Print Me.cboGroupName.RowSource
        Debug.Print Me.cboGroupName.ControlSource
        Debug.Print Me.cboGroupName.Value
    End Function
    

    前提是你的表单绑定了一个表,比如我的是,控制源需要 = "fieldname" 。它需要是双引号中的字段名称。不是 me.fieldname,因为这最终使 controlsource 成为该字段名称的值。它也不能是 [table1]![field1] 我试过了,那也不起作用。

    上面的效果很好。现在来测试表单的其余部分!

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多