子表单组合框行源更新 - 如何更新下拉列表

Posted

技术标签:

【中文标题】子表单组合框行源更新 - 如何更新下拉列表【英文标题】:subform combobox rowsource update - how update drop down list 【发布时间】:2012-03-06 15:28:26 【问题描述】:

我在 MS Access 表单上有一个树形视图控件。子窗体组合框控件的值列表取决于在主窗体的树视图中选择的节点。 我正在尝试实现子窗体上组合框下拉列表内容的刷新,如下所示:

Public Sub TreeView1_nodeClick(ByVal node As Object)
    subForm.Controls("Bid").RowSource = "... newquery depending on tree node values ..."
    subForm.Controls("Bid").Requery
End Sub

但奇怪的是,这并没有更新值列表。 第二次单击同一节点确实会将列表更新为预期值;当另一个节点再次被点击时,列表是错误的(它包含与下一个分配的行源相关的列表,而不是与分配的最后一个相关的列表)。

激活组合框的行源是否有一些延迟? 这个令人讨厌的问题的解决方案是什么?

【问题讨论】:

【参考方案1】:

OK 我自己找到了一个解决方案 - 我不是特别喜欢它 (*),但它确实有效,所以我将其视为临时解决方法,直到其他人使用皇家路线提供解决方案(设置 rowsource 和以某种方式使其具有预期的效果)。

我查看了msdn站点,发现也可以使用自定义函数来填充组合框列表。最简单的部分是 Access 必须使用该函数这一事实的规范:只需在组合框的 Source Type 属性行中输入函数名称,只需简单的函数名称,前面没有任何 = 或 ()在它背后。 现在对于不太容易的部分 - MS 需要特定格式的功能和特定内容。我的看起来如下:

Private Function customFuncName(fld As Control, id As Variant, row As Variant, col As Variant, code As Variant) As Variant
    Dim rs As Recordset
    Set rs = CurrentDb.OpenRecordset(... new query ...)

    Select Case code
        Case acLBInitialize
            customFuncName = True
        Case acLBOpen
            customFuncName = 1
        Case acLBGetRowCount
            customFuncName = rs.RecordCount
        Case acLBGetColumnWidth
            customFuncName = -1
        Case acLBGetValue            
            customFuncName = rs.GetRows(rs.RecordCount)(col, row)
    End Select

End Function

查看msdn.microsoft.com rowSourceType property 和上面的链接specific function code arguments。

(*) 因为明显的记录集开销导致性能下降 - 但由于我显示的列表最多 40 行,它对我来说很好

【讨论】:

以上是关于子表单组合框行源更新 - 如何更新下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

访问使用列表框中选择的项目更新子表单

基于当前字段值的MS访问表单组合框行源

表格中的组合框下拉列表

将 Access 2003 列表框行源(查询)导出到 Excel 2003 的最有效方法

控制子表单的组合框可能会更新表格

如何根据实体框架中的下拉列表选择项填充表单字段以进行更新?