请协助如何让每个组合框显示自己的列表,然后进行过滤

问题描述

我正在认真努力将我的组合框集成到表单中。

我有 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,"*");

,

实现这一点有多种设计选择:

  1. 使用上游 ComboBox 的 AfterUpdate 事件重新查询下游 ComboBox。
  2. 使用按钮过滤和重置组合框的 RowSource重新查询它们。
  3. 级联重新查询下游列表框基于点击上游列表框中的项目。将列表框排列在列中,并将搜索文本框放置在它们上方。

由于第 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

更改文本和过滤之前的组合框 enter image description here

更改文本和过滤后的组合框 enter image description here

在公司组合框中删除文本后组合框恢复 enter image description here

,
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]));