子表单组合框行源更新 - 如何更新下拉列表
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 行,它对我来说很好
【讨论】:
以上是关于子表单组合框行源更新 - 如何更新下拉列表的主要内容,如果未能解决你的问题,请参考以下文章