在评论中,lamcro 观察了梳状框是否具有 Recordset 的问题:
当我进入表单 VB 代码并“添加观察”CB 控件时,记录集属性就在那里。我什至可以进入并查看它自己的属性。
我在设置监视列表时看到了它,但是组合框的记录集无法通过代码访问或更改。为了过滤组合框,您需要使用它的 Rowsource。
这可以通过以下两种方式之一来完成:
- 使用事件为您的组合框动态分配新的行源,或者
- 使用对要在其他组合框的 Rowsource 的 WHERE 子句中过滤其值的控件的引用。
假设您有 cmbComboBox1,当您在其中选择一个值时,您希望根据 cmbComboBox1 中选择的值过滤 cmbComboBox2 中列出的值。对于方法 1,您将使用第一个组合框的 AfterUpdate 来设置第二个组合框的行源:
Private Sub cmbComboBox1_AfterUpdate()
Dim strRowsource As String
strRowsource = "SELECT * FROM MyTable"
If Not IsNull(Me!cmbComboBox1) Then
strRowsource = strRowsource & " WHERE MyField = " & Me!cmbComboBox1
End If
Me!cmbComboBox2.Rowsource = strRowsource
End Sub
要使用第二种方法,您需要将第二个组合框的 Rowsource 定义为基于测试第一个组合框的值:
SELECT * FROM MyTable
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1]
AND IsNull([Forms]![MyForm]![cmbComboBox1])=False)
OR IsNull([Forms]![MyForm]![cmbComboBox1])=True
如果第一个组合框有值,则过滤行源,如果有值,则不过滤它。也就是说,您将获得一个未经过滤的列表,直到为第一个组合框选择了一个值。
然后,在 cmbComboBox1 的 Afterupdate 事件中,您将重新查询第二个组合框:
Private Sub cmbComboBox1_AfterUpdate()
Me!cmbComboBox2.Requery
End Sub
定义一个参数可能也是一个好主意,以确保对表单控件的引用得到适当的解析,因此您的 Rowsource 将是这样的:
PARAMETERS [Forms]![MyForm]![cmbComboBox1] Long;
SELECT * FROM MyTable
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1]
AND IsNull([Forms]![MyForm]![cmbComboBox1])=False)
OR IsNull([Forms]![MyForm]![cmbComboBox1])=True
(假设您正在过滤 Autonumber PK - 如果数据类型不同,您当然会使用不同的数据类型)
我倾向于使用动态 Rowsource 分配,仅仅是因为我发现它在不同的 Access 版本中问题较少(即,对表单控件的引用在所有版本的 Access 中的解析方式不同)。