问题描述
我正在认真努力将我的组合框集成到表单中。
我有 3 个组合框:
1- 公司 - cboComp - tblCompany
2- 类别 - cboCat - tblCategory
3- 机队编号 - cboFlt - tblFltNo
这些 (1&2) 然后通过 cboComp 与 tblFltSetup 的行源进行排序(标准)我已经设置了每个组合框,以便它们相互过滤,但仅设法根据 cboComp 找出如何执行此操作只要它选择了一个值,并且如果在 cboComp 中没有选择任何值,那么其他 2 个组合框在它们的下拉列表中不会显示任何可供选择的值。这也适用于 cboFlt,cboComp 和 cboCat 必须有值,否则我无法为 cboFlt 选择值。
基本上我希望组合框(1,2 和 3)在下拉列表中显示它们各自的完整选项列表,无论其他组合框是否选择了值,但我希望组合框根据例如,如果我决定仅按 cboCat 和 cboFlt 过滤。
这可能吗?我该怎么做?
解决方法
这种技术称为级联(或依赖)组合框,是一个非常常见的话题。
一种方法是使用通配符。
如果组合框具有文本值,请尝试以下操作:
SELECT Category FROM tblCategory WHERE Company LIKE cboCompany & "*";
但是,如果组合框具有数值(可能是主键字段),请尝试:
SELECT CatID,Category FROM tblCategory WHERE CompID LIKE Nz(cboCompany,"*");
实现这一点有多种设计选择:
- 使用上游 ComboBox 的 AfterUpdate 事件重新查询下游 ComboBox。
- 使用按钮过滤和重置组合框的 RowSource 并重新查询它们。
- 级联重新查询下游列表框基于点击上游列表框中的项目。将列表框排列在列中,并将搜索文本框放置在它们上方。
由于第 1 项最接近您的问题,因此我在下面提供了代码和图像,以大约演示我将如何做到这一点(未完善和不完整)。我正在根据示例 Northwind 数据库中的客户表字段过滤订单表。组合框是未绑定的。在用户更改 ComboBox 中的文本后,它会触发 AfterUpdate 事件。
Private Sub cboCustomers_AfterUpdate()
Dim strCustomer As String
Dim intCustomerID As Integer
'Store Customer data before losing focus
strCustomer = cboCustomers.Text
With cboOrders
.SetFocus
'The Customer ComboBox has NO data
If strCustomer = "" Or IsNull(strCustomer) Then
'Select unfiltered Orders table
.RowSource = "SELECT [Order ID],[Customer ID],[Shipped Date],[Payment Type] " & _
"FROM Orders ORDER BY [Shipped Date];"
'The Customer ComboBox has data
Else
'Select filtered Orders table
intCustomerID = cboCustomers.Column(0)
.RowSource = "SELECT [Order ID],[Payment Type] " & _
"FROM Orders WHERE ((([Customer ID])=" & intCustomerID & ")) " & _
"ORDER BY [Shipped Date];"
End If
.Requery
End With
cboCustomers.SetFocus
End Sub
,
SELECT DISTINCT tblFltNoNatKey.FleetNo,tblFleet1.Companies,tblFleet1.Categories,tblFleet1.FleetNo
FROM tblFltNoNatKey INNER JOIN tblFleet1 ON tblFltNoNatKey.FleetNo = tblFleet1.FleetNo
WHERE (((tblFltNoNatKey.FleetNo)=[tblFleet1]![FleetNo]) AND
(([Forms]![FuelLookup]![cboComp]) Is Null) AND
(([Forms]![FuelLookup]![cboCat]) Is Null)) OR
(((tblFleet1.Companies)=[Forms]![FuelLookup]![cboComp]) AND
((tblFleet1.Categories)=[Forms]![FuelLookup]![cboCat])) OR
(((tblFleet1.Companies)=[Forms]![FuelLookup]![cboComp]) AND
(([Forms]![FuelLookup]![cboCat]) Is Null)) OR
(((tblFleet1.Categories)=[Forms]![FuelLookup]![cboCat]));