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

时间:2012-03-06 15:28:27

标签: ms-access vba combobox

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

我检查了msdn网站,发现也可以为组合框列表填充使用自定义函数。这方面的简单部分是Access必须使用该函数的规范:只需在组合框的行Source Type属性中输入函数名称,只需输入普通函数名称,前面没有any =或者()背后。
现在,对于不太容易的部分 - 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行,它对我来说很好