在评论中,lamcro 观察了梳状框是否具有 Recordset 的问题:
当我闯入表单时 VB 代码
和“添加监视” CB 控件,
记录集属性在那里。我能
甚至进入并看到它是自己的
特性。
我在设置监视列表时看到它,但组合框的记录集无法通过代码访问或更改。为了过滤组合框,您需要使用其 Rowsource。
这可以通过以下两种方式之一完成:
- 使用事件将新的 Rowsource 分配给您的组合框,或者
- 在其他组合框的 Rowsource 的 WHERE 子句中使用对要过滤其值的控件的引用。
假设您有 cmbComboBox1,当您在其中选择一个值时,您希望根据 cmbComboBox1 中选择的值过滤 cmbCombBox2 中列出的值。对于方法 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
(假设您正在过滤自动编号 PK ——如果数据类型不同,您当然会使用不同的数据类型)
我倾向于使用动态 Rowsource 分配,只是因为我发现它在不同的 Access 版本中问题较少(即,对表单控件的引用在所有版本的 Access 中的解析方式不同)。