请协助如何让每个组合框显示自己的列表然后进行过滤
Please assist on how to have each combo box display their own list and then be filtered
我正在努力将我的组合框集成到一个表单中。
我有 3 个组合框:
1- 公司 - cboComp - tblCompany
2- 类别 - cboCat - tblCategory
3-机队编号-cboFlt-tblFltNo
然后通过 cboComp 使用 tblFltSetup 的行源对这些 (1&2) 进行排序(标准) cboComp 只要它有值 selected,如果 cboComp 中没有值 selected,那么其他 2 个组合框在它们的下拉列表中不会显示 select。这也适用于 cboFlt,cboComp 和 cboCat 必须有值,否则我不能 select cboFlt 的值。
基本上,我希望组合框 (1,2 & 3) 在下拉列表中显示它们各自的完整选项列表,而不管其他组合框是否具有值 selected 但我随后希望组合框相应地根据每个单独的组合框进行过滤如果我决定仅按 cboCat 和 cboFlt 进行过滤。
这可能吗?我该怎么做?
这种技术称为级联(或依赖)组合框,是一个非常常见的话题。
一种方法是使用通配符。
如果组合框将包含文本值,请尝试类似的操作:
SELECT Category FROM tblCategory WHERE Company LIKE cboCompany & "*";
但是,如果组合框具有数值(可能是主键字段),请尝试:
SELECT CatID, Category FROM tblCategory WHERE CompID LIKE Nz(cboCompany, "*");
实现这个有几种设计选择:
- 使用上游ComboBox的AfterUpdate事件重新查询下游ComboBox。
- 使用按钮过滤和重置 ComboBoxes 的 RowSource 和 Requery 它们。
- Cascade Requery 基于单击上游 ListBox 中的项目的下游 ListBox。将列表框排列成列,并将搜索文本框放在它们上面。
由于第 1 项最接近您的问题,我在下面包含了代码和图像,以大致 演示我将如何做到这一点(未提炼和不完整)。我正在基于示例 Northwind 数据库中的 Customers table 字段过滤 Orders table。 ComboBoxes 是未绑定的。用户更改 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], [Customer ID], [Shipped Date], [Payment Type] " & _
"FROM Orders WHERE ((([Customer ID])=" & intCustomerID & ")) " & _
"ORDER BY [Shipped Date];"
End If
.Requery
End With
cboCustomers.SetFocus
End Sub
更改文本和过滤前的组合框
更改文本和过滤后的组合框
删除公司 ComboBox 中的文本后 ComboBox 恢复
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]));
我正在努力将我的组合框集成到一个表单中。
我有 3 个组合框:
1- 公司 - cboComp - tblCompany
2- 类别 - cboCat - tblCategory
3-机队编号-cboFlt-tblFltNo
然后通过 cboComp 使用 tblFltSetup 的行源对这些 (1&2) 进行排序(标准) cboComp 只要它有值 selected,如果 cboComp 中没有值 selected,那么其他 2 个组合框在它们的下拉列表中不会显示 select。这也适用于 cboFlt,cboComp 和 cboCat 必须有值,否则我不能 select cboFlt 的值。
基本上,我希望组合框 (1,2 & 3) 在下拉列表中显示它们各自的完整选项列表,而不管其他组合框是否具有值 selected 但我随后希望组合框相应地根据每个单独的组合框进行过滤如果我决定仅按 cboCat 和 cboFlt 进行过滤。
这可能吗?我该怎么做?
这种技术称为级联(或依赖)组合框,是一个非常常见的话题。
一种方法是使用通配符。
如果组合框将包含文本值,请尝试类似的操作:
SELECT Category FROM tblCategory WHERE Company LIKE cboCompany & "*";
但是,如果组合框具有数值(可能是主键字段),请尝试:
SELECT CatID, Category FROM tblCategory WHERE CompID LIKE Nz(cboCompany, "*");
实现这个有几种设计选择:
- 使用上游ComboBox的AfterUpdate事件重新查询下游ComboBox。
- 使用按钮过滤和重置 ComboBoxes 的 RowSource 和 Requery 它们。
- Cascade Requery 基于单击上游 ListBox 中的项目的下游 ListBox。将列表框排列成列,并将搜索文本框放在它们上面。
由于第 1 项最接近您的问题,我在下面包含了代码和图像,以大致 演示我将如何做到这一点(未提炼和不完整)。我正在基于示例 Northwind 数据库中的 Customers table 字段过滤 Orders table。 ComboBoxes 是未绑定的。用户更改 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], [Customer ID], [Shipped Date], [Payment Type] " & _
"FROM Orders WHERE ((([Customer ID])=" & intCustomerID & ")) " & _
"ORDER BY [Shipped Date];"
End If
.Requery
End With
cboCustomers.SetFocus
End Sub
更改文本和过滤前的组合框
更改文本和过滤后的组合框
删除公司 ComboBox 中的文本后 ComboBox 恢复
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]));